2012-09-27 33 views
7

我正在使用OpenCV从网络摄像头获取实时流并检测到人脸后。我正在调整它们,以便只显示我的脸部。在picturebox中以cv :: Mat格式显示摄像头源

但问题是,我做的这一切在C++ Windows窗体,我希望它显示在PictureBox而不是让OpenCV中imshow()窗口显示。我正在使用cv::Mat,所以我在图片框中显示很多问题。

我已经尝试将它转换为IplImage,但那也不起作用。 另外,我试过谷歌,但我无法得到一个工作解决方案。我一直在尝试这个3天。

这里是我的显示代码:

    face = getFace(frame); 
       cv::imshow("window",face); 

其中framefacecv::Mat

+0

要显示到图片框中,您需要将该IplImage转换为位图。 – SinisterMJ

+0

你能为此提供代码行吗? –

+0

我只有用于构建位图的C#代码。它需要数据指针(IplImage-> dataOrigin)和大小来构造它。由于PictureBox实际上是C#的东西,我没有在C++中使用它。对于C++,我宁愿推荐使用OpenGL或DirectX显示,因为它的速度非常快。 – SinisterMJ

回答

5

这里是一个C++ CLR函数画在任何Windows窗体控件的OpenCV垫:

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通道图像。

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

+0

纠正我,如果我错了,但你不需要'graphics'> Dispose();'在你用它画完以后的最后? [“相反,每次要使用Graphics对象时都必须调用CreateGraphics,然后在完成使用后调用Dispose。](https://msdn.microsoft.com/en-us/library/system。 windows.forms.control.creategraphics(v = vs.110).aspx) – kdbanman

+0

@kdbanman ... Thankyou指出它我没有意识到这一点在C++ CLR中,我们必须调用delete,而不是'Dispose'。 – sgarizvi