2012-09-27 44 views
7

Tôi đang sử dụng OpenCV để phát trực tiếp từ webcam và sau khi phát hiện khuôn mặt. Tôi đang thay đổi kích cỡ chúng để chỉ có khuôn mặt của tôi được hiển thị.Hiển thị nguồn cấp dữ liệu webcam trong cv :: Định dạng Mat trong hình ảnh

Nhưng vấn đề là tôi đang làm tất cả điều này trong C++ Windows Forms và tôi muốn nó được hiển thị trong một PictureBox thay vì nhận được màn hình hiển thị trong OpenCV imshow() cửa sổ.

Tôi đang sử dụng cv::Mat vì vậy tôi đang gặp phải rất nhiều vấn đề với hiển thị trong hộp hình ảnh.

Tôi đã thử chuyển đổi nó thành IplImage nhưng điều đó không hoạt động. Ngoài ra, tôi đã thử Google nhưng tôi không thể có giải pháp làm việc. Tôi đã thử điều này trong 3 ngày.

Dưới đây là mã của tôi để hiển thị:

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

nơi framefacecv::Mat

+0

Để hiển thị hình ảnh, bạn cần chuyển đổi IplImage đó thành bitmap. – SinisterMJ

+0

bạn có thể cung cấp dòng mã cho điều đó không? –

+0

Tôi chỉ có mã C# để xây dựng một Bitmap. Nó lấy con trỏ dữ liệu (IplImage-> dataOrigin) và kích thước để xây dựng nó. Vì PictureBox thực sự là một điều C#, tôi đã không sử dụng nó trong C++. Đối với C + +, tôi muốn khuyên bạn nên làm OpenGL hoặc DirectX hiển thị, vì nó chỉ nhanh hơn rất nhiều. – SinisterMJ

Trả lời

5

Đây là một chức năng C++ CLR để vẽ OpenCV mat trên bất kỳ Windows Form Control:

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

Chức năng này chỉ có thể vẽ 8 bit 3 hình ảnh kênh.

Thử thử nghiệm với Định dạng pixel của bitmap cho các loại hình ảnh khác.

+0

Sửa tôi nếu tôi sai, nhưng bạn không cần một cuộc gọi 'đồ họa-> Vứt bỏ();' ở cuối sau khi bạn đã sử dụng nó để vẽ? ["Thay vào đó, bạn phải gọi CreateGraphics mỗi khi bạn muốn sử dụng đối tượng Đồ họa, và sau đó gọi là Vứt bỏ khi bạn sử dụng xong nó.] (Https://msdn.microsoft.com/en-us/library/system. windows.forms.control.creategraphics (v = vs.110) .aspx) – kdbanman

+0

@kdbanman ... Cảm ơn bạn đã chỉ ra nó.Tôi không biết điều đó.Trong C++ CLR, chúng ta phải gọi toán tử 'delete' thay vì 'Vứt bỏ'. – sgarizvi

Các vấn đề liên quan