C#中如何将SoftwareBitmap转换为Mat?
C#中SoftwareBitmap转OpenCV Mat的方案
方法一:直接操作像素缓冲区(高效推荐)
通过直接访问SoftwareBitmap的像素缓冲区,创建对应的OpenCV Mat对象,这是效率最高的方式:
using OpenCvSharp; using Windows.Graphics.Imaging; using System.Runtime.InteropServices; public Mat SoftwareBitmapToMat(SoftwareBitmap softwareBitmap) { // 统一转换为BGRA8格式(OpenCV默认兼容该格式) if (softwareBitmap.BitmapPixelFormat != BitmapPixelFormat.Bgra8) { softwareBitmap = SoftwareBitmap.Convert(softwareBitmap, BitmapPixelFormat.Bgra8); } // 锁定缓冲区以访问像素数据 using (var buffer = softwareBitmap.LockBuffer(BitmapBufferAccessMode.Read)) using (var reference = buffer.CreateReference()) { // 获取像素数据的指针和总长度 ((IMemoryBufferByteAccess)reference).GetBuffer(out byte* dataPtr, out uint dataLength); // 创建Mat:参数依次为高、宽、像素类型、数据指针、每行字节数 var tempMat = new Mat( softwareBitmap.PixelHeight, softwareBitmap.PixelWidth, MatType.CV_8UC4, (IntPtr)dataPtr, softwareBitmap.PixelWidth * 4 ); // 克隆Mat避免缓冲区释放后数据失效 return tempMat.Clone(); } } // 用于访问MemoryBuffer的COM接口 [ComImport] [Guid("5B0D3235-4DBA-4D44-865E-8F1D0E4FD04D")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] internal interface IMemoryBufferByteAccess { void GetBuffer(out byte* buffer, out uint capacity); }
方法二:通过WriteableBitmap中转(简单但效率稍低)
借助WriteableBitmap作为中间载体,利用OpenCvSharp内置的转换器完成转换:
using OpenCvSharp; using Windows.Graphics.Imaging; using Windows.UI.Xaml.Media.Imaging; public Mat SoftwareBitmapToMatViaWriteableBitmap(SoftwareBitmap softwareBitmap) { // 初始化WriteableBitmap并复制像素数据 var writeableBitmap = new WriteableBitmap(softwareBitmap.PixelWidth, softwareBitmap.PixelHeight); softwareBitmap.CopyToBuffer(writeableBitmap.PixelBuffer); // 使用OpenCvSharp的转换器直接转Mat return BitmapConverter.ToMat(writeableBitmap); }
关键注意事项
- 必须安装OpenCvSharp相关NuGet包:
OpenCvSharp4(核心库)和OpenCvSharp4.runtime.win(Windows平台运行时) - 若原SoftwareBitmap是灰度图,需转换为
BitmapPixelFormat.Gray8,同时将Mat类型设为MatType.CV_8UC1 - 直接操作缓冲区时必须克隆Mat,因为临时Mat直接指向SoftwareBitmap的缓冲区,缓冲区解锁后原Mat会变成无效数据
- 如果需要将Mat转回SoftwareBitmap,可反向操作:从Mat提取像素数据后写入SoftwareBitmap的缓冲区
内容的提问来源于stack exchange,提问作者Dmitrii Polianskii
相关产品推荐
相关产品推荐

