Python bitmap转byte, Mat

Python bitmap转byte, Mat,第1张

Python bitmap转Mat

我相信能发现这个问题的都是在玩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,多次转换造成效率低,虽然可以通过开多线程缓解,但是我之后还是研究有没有更加高效的做法。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/759603.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-01
下一篇 2022-05-01

发表评论

登录后才能评论

评论列表(0条)

保存