2012-09-27 7 views
7

Ich benutze OpenCV, um einen Live-Stream von einer Webcam aufzunehmen und Gesichter zu erkennen. Ich vergrößere sie so, dass nur mein Gesicht angezeigt wird.Webcam-Feed im cv :: Matten-Format in einer Picturebox anzeigen

Aber das Problem ist, dass ich das alles in C++ Windows-tue Forms und ich möchte es in einem PictureBox angezeigt werden, anstatt die Anzeige immer in OpenCV imshow() Fenstern.

Ich benutze cv::Mat, so habe ich eine Menge Probleme mit der Anzeige in der Bilderbox.

Ich habe versucht, es in IplImage zu konvertieren, aber das hat auch nicht funktioniert. Auch habe ich Google ausprobiert, aber ich konnte keine funktionierende Lösung bekommen. Ich habe das seit 3 ​​Tagen probiert.

Hier ist mein Code für die Anzeige:

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

wo frame und face sind cv::Mat

+0

Um in eine Picturebox anzuzeigen, müssen Sie IplImage in eine Bitmap konvertieren. – SinisterMJ

+0

können Sie bitte die Codezeile dafür bereitstellen? –

+0

Ich habe nur C# -Code zum Erstellen einer Bitmap. Es nimmt den Datenzeiger (IplImage-> dataOrigin) und die Größe, um es zu konstruieren. Da eine PictureBox wirklich eine C# -Sache ist, habe ich sie nicht in C++ verwendet. Für C++ würde ich eher OpenGL oder DirectX empfehlen, da es einfach so viel schneller ist. – SinisterMJ

Antwort

5

Hier ist eine C++ CLR-Funktion ist OpenCV Matte auf jedem Windows-Formular-Steuerelement zu zeichnen:

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; 
} 

Diese Funktion kann nur 8-Bit-3-Kanal-Bilder zeichnen.

Experimentieren Sie mit Pixel Format der Bitmap für andere Bildtypen.

+0

Korrigieren Sie mich, wenn ich falsch liege, aber brauchen Sie nicht einen 'graphics-> Dispose();' Aufruf am Ende, nachdem Sie ihn zum Zeichnen benutzt haben? ["Stattdessen müssen Sie CreateGraphics jedes Mal aufrufen, wenn Sie das Graphics-Objekt verwenden möchten, und dann Dispose aufrufen, wenn Sie damit fertig sind." (Https://msdn.microsoft.com/en-us/library/system. windows.forms.control.creategraphics (v = vs.110) .aspx) – kdbanman

+0

@ kdbanman ... Danke, dass Sie darauf hingewiesen haben.Ich war mir dessen nicht bewusst.In C++ CLR müssen wir den 'delete' Operator aufrufen 'Entsorgen'. – sgarizvi

Verwandte Themen