C# 将 Bitmap 转换为 Emgu Mat 总是失败

问题描述 投票:0回答:2

我正在尝试将位图转换为 mat 以用于 OpenCV。 但出于某种原因他们不让我转换它。 我在 Stack 上找到了下面的代码,也在许多其他网站上看到了它。

这里有人知道为什么它不起作用吗?

无法将“System.Drawing.Bitmap”转换为“byte[ , , ]”。

请注意,一开始有 8 个屏幕截图是设置坐标的,这些屏幕截图保存为位图,然后应转换为 mat。

请查看嵌入的图像。

  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;

此图片显示错误消息。

c# visual-studio opencv emgucv
2个回答
0
投票

首先,您不是将图像转换为

Mat
而是转换为
Image<>
(有关差异和 Mat 是什么的更多信息这里)。

要将文件中的任何图像转换为

Mat
,您只需使用以下命令即可:

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

要将

Bitmap
转换为
Mat
,您可以安装 NuGet
Emgu.CV.Bitmap
,它添加一些扩展以方便转换为
Bitmap

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

0
投票

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

方法:

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

附注 起初,垫子逆时针旋转了 90 度,所以我添加了一个旋转计数器,所以请注意一些奇怪的旋转。

反转前:

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.