Visual Studio C#将位图转换为Emgu Mat总是失败

50few1ms  于 2023-11-21  发布在  C#
关注(0)|答案(2)|浏览(178)

我试图将位图转换为用于OpenCV的MAT。但由于某种原因,他们不让我转换它。我在Stack上找到了下面的代码,并在许多其他网站上看到了它。
有人知道为什么它不工作吗?

  • 无法将“系统.绘图.位图”转换为“字节[,,]"。*

作为一个说明,在开始时,8个屏幕截图被设置为坐标,这些被保存为位图,然后应该被转换为垫。
请看嵌入的图像。

public static Image<Bgr, byte> FromFile = new Image<Bgr, byte>("MyImage.jpg");
    Mat mat = FromFile.Mat; // Only a way to convert it succesfull,  
                            // but isnt the way i want to go.

    public static Bitmap skillQ;
    public static Image<Bgr, byte> FromBitmap = new Image<Bgr, byte>(skillQ).ToImage; 
    Mat mat2 = FromBitmap.Mat;         

   
    
    //public static Image<Bgr, byte> FromBitmap = new Image<Bgr, byte>(skillQ).ToImage;

字符串
此图像显示错误消息。


的数据

gzszwxb4

gzszwxb41#

首先,您不是将图像转换为Mat,而是转换为Image<>(有关差异以及here是什么的更多信息)。
要将任何图像从文件转换为Mat,您只需使用以下命令:

Mat fromFile = new Mat("test.bmp");

字符串
要将Bitmap转换为Mat,您可以安装NuGet Emgu.CV.Bitmap,它添加了一些扩展以促进转换为Bitmap

Bitmap bitmapTest = fromFile.ToBitmap();
Mat fromBitmap = bitmapTest.ToMat();

qcuzuvrc

qcuzuvrc2#

你可以简单地用这个方法为你转换它,这个方法对我来说非常有效。
方法:

static void BitmapToMat(Bitmap bitmap, Mat mat)
{
    BitmapData bmpData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
    CvInvoke.CvtColor(new Mat(bmpData.Height, bmpData.Width, DepthType.Cv8U, 3, bmpData.Scan0, bmpData.Stride), mat, ColorConversion.Bgr2Bgra);
    bitmap.UnlockBits(bmpData);
}

字符串

相关问题