我正在尝试将位图转换为 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;
此图片显示错误消息。
首先,您不是将图像转换为
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();
你可以简单地使用这个方法来为你转换它, 这个方法对我来说非常有效。
方法:
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);
}