如何使用OpenCVSharp将Mat转换为Bitmap?

13

首先,我尝试了这个,

    public static Bitmap MatToBitmap(Mat mat)
    {
        return OpenCvSharp.Extensions.BitmapConverter.ToBitmap(mat);
    }

enter image description here

所以,我尝试了这个:

    public static Bitmap MatToBitmap(Mat mat)
    {
        mat.ConvertTo(mat, MatType.CV_8U);
        return OpenCvSharp.Extensions.BitmapConverter.ToBitmap(mat);
    }

这张图片完全是黑色的,

enter image description here

    public static Bitmap ConvertMatToBitmap(Mat matToConvert) 
    {            
        return new Bitmap(matToConvert.Cols, matToConvert.Rows, 4*matToConvert.Rows, System.Drawing.Imaging.PixelFormat.Format8bppIndexed, matToConvert.Data);
    }

这也不起作用。

enter image description here

4个回答

13

我建议您使用IplImage类型,而不是使用Mat类型。以下示例代码可供参考(我使用带有OpenCvSharp2的VisualStudio2013):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenCvSharp;
using System.Drawing;

namespace TestOpenCVSharp
{
    class Program
    {
        static void Main(string[] args)
        {
            // Read the Lenna image
            IplImage inputImage = new IplImage(@"Lenna.png");

            // Display the input image for visual inspection
            new CvWindow("original image", inputImage);
            Cv.WaitKey();

            // Convert into bitmap
            Bitmap bitimg = MatToBitmap(img);                
            // Save the bitmap
            bitimg.Save(@"bitmap.png");
        } // end of main function

        // This is the function that converts IplImage image
        // into Bitmap
        public static Bitmap MatToBitmap(IplImage image)
        {
            return OpenCvSharp.Extensions.BitmapConverter.ToBitmap(image);
        } // end of MatToBitmap function
    } // end of class definition
}  // end of namespace definition

这是您输入的 Lenna 图像:

enter image description here

这是从Bitmap类型创建的bitmap.png

enter image description here

希望能有所帮助!
更新:
通过使用OpenCVSharp3,以下代码也可以将Mat类型转换为Bitmap类型:
Mat image = new Mat(@"Lenna.png");
Cv2.ImShow("image", image);
Cv2.WaitKey();

Bitmap bitimg = MatToBitmap(image);
// Save the bitmap
bitimg.Save(@"bitmap.png");

使用该函数:

public static Bitmap MatToBitmap(Mat image)
{
   return OpenCvSharp.Extensions.BitmapConverter.ToBitmap(image);
} // end of MatToBitmap function

得到的结果与上面显示的相同。


将mat转换为位图是不可能的吗? - user366312
你能提供一下创建矩阵的代码吗?这样我可以更好地评估。 - user5133845

6
其他解决方案对我几乎都起不到作用。虽然位图存在,但有时会抛出一个异常,说encoder为空。
我使用以下代码解决了这个问题。
private static Bitmap MatToBitmap(Mat mat) {
    using (var ms = mat.ToMemoryStream()) {
        return (Bitmap) Image.FromStream(ms);
    }
}

5
其他解决方案都不能与OpenCVSharp 4一起使用。 - Calabacin

3

Mat有一个返回Bitmap的方法:

        mat.ToBitmap(bitmap);

这也需要使用OpenCvSharp.Extensions库。

2
是的,您可以这样做,但在Mat被释放后就不能再使用Bitmap了。 - rism

0
using OpenCvSharp.Extensions; 

Mat mat = new Mat(@"Lenna.png");
Bitmap bitmap = mat.ToBitmap();

您需要使用OpenCvSharp.Extensions,可以通过在NuGet中搜索"OpenCvSharp4.Extensions"进行安装。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接