栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python bitmap转byte, Mat

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python bitmap转byte, Mat

Python bitmap转Mat

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/834995.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号