我想请一些帮助,让我了解Mat,Image和Bitmaps。我在C#中使用Emgu CV,我想将捕获的桌面屏幕(位图)转换为mat。我找到了一些建议here,但它对我不起作用。
我想要做的是将位图转换为图像,将图像转换为mat,然后将mat转换回图像,将图像转换回位图,以便我可以将其转换为图片框。问题是当我从mat转换为image时会抛出一个异常:
正如我所看到的,在将图像转换为mat时存在问题,因为垫子的行(宽度)非常大。
这是我正在使用的代码。
public void Video()
{
int Width = Screen.PrimaryScreen.Bounds.Width;
int Height = Screen.PrimaryScreen.Bounds.Height;
Size size = new Size(Height, Width);
for ( ; ; )
{
System.Drawing.Image image;
Bitmap bitmap = new Bitmap(Width, Height );
Graphics graphics = Graphics.FromImage(bitmap as Image);
graphics.CopyFromScreen(0, 0, Width, Height, bitmap.Size);
Image<Bgr, Byte> imageCV = new Image<Bgr, Byte>(bitmap);
// CvInvoke.BitwiseNot(imageCV1, imageCV2, null);
Mat m = new Mat(Height, Width , DepthType.Cv8U , 4);
m = imageCV.Mat;
Image<Bgr, Byte> mToImage = m.ToImage<Bgr, Byte>(); //error line
// Bitmap btm = mToImage.ToBitmap();
Bitmap btm = mToImage.ToBitmap(m.Height, m.Width);
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
pictureBox1.Image = btm;
imageCV.Dispose();
mToImage.Dispose();
}
}
我知道有类似的问题已被提出,也许我应该能够把各个部分放在一起,但我的想法用完了。我也尝试设置Mat的大小,因此行数不能太高,我也尝试在将位图传递给图像之前将其反转。如果有人能帮我理解他们背后的概念和这个问题,我会很高兴的。
答案 0 :(得分:1)
我必须通过简单地创建一个新项目并再次重新添加必要的库来解决问题。问题是我没有正确地将它们添加到我的项目中。 (Emgu.CV.World.dll,Emgu.CV.UI.dll和其他dll,可以在EmguCV的构建文件夹中找到。)