Image<Bgr, Byte> ImageFrame = capture.QueryFrame(); //line 1
CamImageBox.Image = ImageFrame.ToBitmap();
我已将上面的代码用于 Windows 窗体图片框中的
Display
EmguCV
图像,
但我有一个错误:
无法将类型“system.drawing.bitmap”隐式转换为 'emgu.cv.image'
Stackoverflow 问题中也有这种情况,但没有人对此给出正确答案。
您似乎混淆了 PictureBox (由 System.Windows.Forms 中的 .NET 框架提供)和 ImageBox (这是 Emgu.CV.UI 中的 EmguCV 类)。由于这两个元素非常相似,因此很容易混淆。
ImageBox 是一个与 PictureBox 类似的用户控件。代替 显示 Bitmap,它显示任何 Image<,> 对象。它还提供 用于简单图像处理的额外功能。
在您的代码示例中,您的“CamImageBox”元素是一个
ImageBox
。将 Bitmap
添加到 ImageBox
确实会导致以下错误:
无法将类型“System.Drawing.Bitmap”隐式转换为 'Emgu.CV.IImage'
ImageBox
的伟大之处在于它为您提供了专注于 EmguCV 的附加功能。这些功能之一是您可以直接显示 EmguCV Image<,>
和 Mat
对象,这为您节省了 ToBitmap()
转换。如果您想继续使用 ImageBox
元素,可以使用以下两个选项之一:
Mat matImage = capture.QueryFrame();
CamImageBox.Image = matImage; // Directly show Mat object in *ImageBox*
Image<Bgr, byte> iplImage = matImage.ToImage<Bgr, byte>();
CamImageBox.Image = iplImage; // Show Image<,> object in *ImageBox*
请注意,
从
开始,IplImage 正在被逐步淘汰。 EmguCV 3.0 是 跟随。 Image<,> 尚未正式弃用,但请保留 记住这一点。OpenCV 3.0
因此,请注意,在 EmguCV 3.0 中
QueryFrame()
将返回 Mat
!有关更多信息,请参阅此答案:https://stackoverflow.com/a/19119408/7397065
此外,如果您将 GUI 中的 ImageBox
元素更改为
PictureBox
元素,您当前的代码将会工作。