2012-09-27 19 views
7

Web kamerasından canlı yayın çekmek ve yüzleri tespit ettikten sonra OpenCV kullanıyorum. Onları yeniden boyutlandırıyorum, böylece sadece yüzüm görüntülenir.Web kamerası özet akışını görüntüleme cv :: Bir resimdeki mat format

Ama sorun C++ Windows tüm yapıyorum ki Forms ve bunu yerine OpenCV imshow() pencerede ekrana almanın bir PictureBox görüntülenmesini istiyorum.

cv::Mat kullanıyorum, bu yüzden resim kutusunda çok büyük sorun yaşıyorum.

IplImage numaralı klasöre dönüştürmeyi denedim ancak bu da çalışmadı. Ayrıca, Google'ı denedim ancak çalışma çözümü alamadım. 3 gün boyunca bunu deniyorum.

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

:

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

nerede frame ve face İşte

+0

Bir resim tablosuna görüntülemek için, bu IplImage'ı bir bitmap'e dönüştürmeniz gerekir. – SinisterMJ

+0

pls bunun için kod satırı sağlayabilir misiniz? –

+0

Sadece bir Bitmap oluşturmak için C# kodum var. Veri işaretçisi (IplImage-> dataOrigin) ve onu oluşturmak için boyut alır. Bir PictureBox gerçekten bir C# şey olduğu için, C++ 'da kullanmamıştım. C++ için OpenGL veya DirectX ekranını tavsiye etmekteyim, çünkü sadece çok daha hızlı. – SinisterMJ

cevap

5

cv::Mat herhangi bir Windows Form Kontrolü OpenCV mat çizmek için bir C++ CLR işlevi olduğunu şunlardır:

İşte görüntülemek için benim kod Bu işlev sadece 8 bit 3 kanallı görüntüler çizebilir.

Diğer görüntü türleri için bitmap'in Piksel Biçimi ile deneme yapmayı deneyin.

+0

Eğer yanılıyorsam düzeltin, ancak çizim yapmak için kullandıktan sonra 'Grafikler -> Dispose(); [Bunun yerine, Graphics nesnesini kullanmak istediğiniz her defasında CreateGraphics'i çağırmanız ve ardından kullanmayı bitirdiğinizde Atla'yı çağırmanız gerekir.] (Https://msdn.microsoft.com/en-us/library/system. windows.forms.control.creategraphics (v = vs.110) .aspx) – kdbanman

+0

@kdbanman ... Bunu işaret ettiğin için teşekkürler .. Bunun farkında değildim. C++ CLR'de, yerine "delete" operatörünü çağırmalıyız. 'Dispose'. – sgarizvi