2012-09-27 17 views
7

Estoy usando OpenCV para tomar una transmisión en vivo desde una cámara web y después de detectar caras. Los estoy redimensionando para que solo se muestre mi cara.Visualización de la alimentación de la cámara web en formato cv :: Mat en cuadro de imagen

Pero el problema es que yo estoy haciendo todo esto en C++ Windows Forms y quiero que se muestre en un PictureBox en vez de conseguir la visualización en OpenCV imshow() ventana.

Estoy usando cv::Mat, así que estoy teniendo un gran problema con la visualización en el cuadro de imagen.

He intentado convertirlo en IplImage pero eso tampoco funcionó. Además, probé con Google pero no pude obtener una solución funcional. He estado probando esto por 3 días.

Aquí está mi código para la visualización:

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

donde frame y face son cv::Mat

+0

Para mostrar en un cuadro de imagen, debe convertir ese IplImage en un mapa de bits. – SinisterMJ

+0

puede usted proporcionar la línea de código para eso? –

+0

Solo tengo el código C# para construir un mapa de bits. Toma el puntero de datos (IplImage-> dataOrigin) y el tamaño para construirlo. Como un PictureBox es realmente una cosa de C#, no lo he usado en C++. Para C++, preferiría recomendar la visualización de OpenGL o DirectX, ya que es mucho más rápido. – SinisterMJ

Respuesta

5

Aquí es una función de C++ CLR para llamar la estera OpenCV en cualquier control de Windows Forms:

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

Esta función solo puede dibujar imágenes de 8 bits y 3 canales.

Intente experimentar con Pixel Formato del mapa de bits para otros tipos de imágenes.

+0

Corrígeme si me equivoco, pero ¿no necesita una llamada 'graphics-> Dispose();' al final después de haberla utilizado para dibujar? ["En cambio, debe llamar a CreateGraphics cada vez que desee usar el objeto Graphics y luego llamar a Dispose cuando haya terminado de usarlo.] (Https://msdn.microsoft.com/en-us/library/system. windows.forms.control.creategraphics (v = vs.110) .aspx) – kdbanman

+0

@kdbanman ... Gracias por señalarlo. No era consciente de eso. En C++ CLR, debemos llamar al operador 'delete' en lugar de 'Dispose'. – sgarizvi

Cuestiones relacionadas