2012-09-27 60 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