我相信能发现这个问题的都是在玩class="superseo">pythonnet,并尝试把Bitmap转成OpenCV使用。
C#的话,OpenCV用的是Mat,Bitmap转成CV::Mat后,OpenCV可以直接使用。
Python的话,cv2虽说用的是UMat,但是可以用np.ndarray类型,因此可以通过byte[]来进行转换。
目前我用的最快做法是第一种,但我相信还有更快的做法:
import clr
from System import Byte
from System.IO import MemoryStream, SeekOrigin
def bitmap2bytes(bitmap):
stream = MemoryStream()
bitmap.Save(stream, bitmap.RawFormat.Png)
stream.Seek(0, SeekOrigin.Begin)
data = bytes(stream.ToArray())
return data
img = queue.get() # get bitmap
img = bitmap2bytes(img)
img = np.frombuffer(img, dtype=np.uint8)
img = cv2.imdecode(img, cv2.CV_8UC2)
第二种比较麻烦,是使用第三方库
import clr
clr.AddReference("OpenCvSharp")
from OpenCvSharp import *
clr.AddReference("OpenCvSharp.Extensions")
from OpenCvSharp.Extensions import *
# clr.AddReference("OpenCvSharpExtern")
# from OpenCvSharpExtern import *
img = queue.get()
img = bitmap2bytes(img)
img = BitmapConverter.ToMat(img)
img = np.frombuffer(bytes(img.ToBytes()), dtype=np.uint8)
img = np.frombuffer(img, dtype=np.uint8)
img = cv2.imdecode(img, cv2.CV_8UC2) # 如果是4通道要改成 CV_8UC3
Bitmap越大,转换效率越低是必然的。
第1种做法 Bitmap -> MemoryStream -> bytes[] -> numpu.ndarray -> cv::mat
第2种做法 Bitmap -> CV::Mat -> bytes[] -> numpu.ndarray -> cv::mat
我也想知道为什么不能 Bitmap -> CV::Mat -> cv::mat,多次转换造成效率低,虽然可以通过开多线程缓解,但是我之后还是研究有没有更加高效的做法。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)