在picturebox中以cv::Mat格式显示网络摄像头的视频源

7
我正在使用OpenCV来捕获摄像头的实时视频流,并在检测到人脸后将其调整大小,以便只显示我的脸。 但问题是我是在C++ Windows Forms中完成所有操作的,而我希望该操作能够在PictureBox中显示,而不是在OpenCV的imshow()窗口中显示。 我正在使用cv::Mat,因此在PictureBox中显示存在很大问题。 我已经尝试将其转换为IplImage,但也没有起作用。另外,我已经在谷歌上搜索过,但仍然没有找到可行的解决方案。我已经尝试了3天。 以下是我的显示代码:
                 face = getFace(frame);
                 cv::imshow("window",face);

其中framefacecv::Mat


要在picturebox中显示,您需要将IplImage转换为位图。 - SinisterMJ
请问您能提供那段代码的行数吗? - U.B.A.R
我只有用C#构建Bitmap的代码。它需要数据指针(IplImage->dataOrigin)和大小来构建它。由于PictureBox实际上是一个C#的东西,我没有在C++中使用它。对于C++,我更愿意推荐使用OpenGL或DirectX显示,因为它们要快得多。 - SinisterMJ
如果可能的话,请尝试使用Qt进行显示...它很容易使用...您可以使用Qt创建的显示窗口显示OpenCV读取的任何图像,而不是OpenCV窗口...特别是需要向下和向右滚动的大型图像... - rotating_image
1个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
6
这是一个用于在任何Windows表单控件上绘制OpenCV mat的C++ CLR函数:
void DrawCVImage(System::Windows::Forms::Control^ control, cv::Mat& colorImage)
{
    System::Drawing::Graphics^ graphics = control->CreateGraphics();
    System::IntPtr ptr(colorImage.ptr());
    System::Drawing::Bitmap^ b  = gcnew System::Drawing::Bitmap(colorImage.cols,colorImage.rows,colorImage.step,System::Drawing::Imaging::PixelFormat::Format24bppRgb,ptr);
    System::Drawing::RectangleF rect(0,0,control->Width,control->Height);
    graphics->DrawImage(b,rect);
    delete graphics;
}

这个函数只能绘制8位3通道图像。

尝试使用位图的像素格式来尝试其他类型的图像。


如果我没说错的话,你不需要在绘制完成后添加graphics->Dispose();吗?相反,每次需要使用Graphics对象时都必须调用CreateGraphics方法,然后在使用完毕后调用Dispose方法。 请参考链接 https://msdn.microsoft.com/zh-cn/library/system.windows.forms.control.creategraphics(v=vs.110).aspx。 - kdbanman
@kdbanman... 感谢您指出这一点。在 C++ CLR 中,我们必须调用 delete 运算符而不是 Dispose - sgarizvi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,