C# 实现 bitmap 和 mat 的格式相互转换

库函数实现的函数:

// (1) 转为 bitmap:
Bitmap map = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(mat);
process_pictureBox.Image = map;

// (2) Image img 转为Mat:
Bitmap bitmap = new Bitmap(img);//Image img
OpenCvSharp.Mat mat = OpenCvSharp.Extensions.BitmapConverter.ToMat(bitmap);//用bitmap转换为mat

该方法内存泄露比较严重,噌噌往上涨,下面的方法要好一些。

个人封装的函数:

// (1)转为 bitmap:
public static Bitmap MatToBitmap(Mat dst)
{
    return new Bitmap(dst.Cols, dst.Rows, (int)dst.Step(), PixelFormat.Format24bppRgb, dst.Data);
}

// (2)Image img 转为Mat
public static Mat BitmapToMat(Bitmap srcbit)
{
    int iwidth = srcbit.Width;
    int iheight = srcbit.Height;
    int iByte = iwidth * iheight * 3;
    byte[] result =  new byte[iByte];
    int step;

    Rectangle rect = new Rectangle(0, 0, iwidth, iheight);
    BitmapData bmpData = srcbit.LockBits(rect, ImageLockMode.ReadWrite, srcbit.PixelFormat);
    IntPtr iPtr = bmpData.Scan0;
    Marshal.Copy(iPtr, result , 0, iByte);
    step = bmpData.Stride;
    srcbit.UnlockBits(bmpData);
    return new Mat(srcbit.Height, srcbit.Width, new MatType(MatType.CV_8UC3), result ,step);
}
weinxin
我的微信
一个码农、工程狮、集能量和智慧于一身的、DIY高手、小伙伴er很多的、80后奶爸。
Igor
  • 版权声明: 发表于 2023-01-1510:46:05
  • 转载注明:http://blog.tsingmac.com/prolions/imagetech/opencv/6020/
opencv和pillow对图片的读写耗时对比 OpenCV

opencv和pillow对图片的读写耗时对比

🧁生成数组 不同的包对于读写图片有不同的优化方式,导致他们的读写时间有差异,这个差异一般情况下可能无所谓,但是在大量图片数据的读写时,却可以节约大量的时间。 生成二维数组: import cv2 im...
Mat 和 bmp图像格式的相互转换 OpenCV

Mat 和 bmp图像格式的相互转换

前言 格式转换很常见,其实在我实现了 Mat 转 bmp 之后才发现原来 imwrite 接口可以直接将 Mat 数据保存为 .bmp图像,不过下文所谈及的转换是在内存中的转换,因为将图像发送给识别服...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: