2012-09-27 14 views
7

मैं वेबकैम से लाइव स्ट्रीम लेने और चेहरे का पता लगाने के बाद ओपनसीवी का उपयोग कर रहा हूं। मैं उनका आकार बदल रहा हूं ताकि केवल मेरा चेहरा प्रदर्शित हो।सीवी में वेबकैम फ़ीड प्रदर्शित करना :: एक चित्र बॉक्स में मट प्रारूप

लेकिन समस्या यह है कि मैं सी ++ Windows में यह सब कर रहा हूँ है फॉर्म्स और मैं इसे बजाय OpenCV imshow() विंडो में प्रदर्शन होने का एक PictureBox में प्रदर्शित करना चाहते हैं।

मैं cv::Mat का उपयोग कर रहा हूं इसलिए मुझे तस्वीर बॉक्स में प्रदर्शित होने में बड़ी समस्या है।

मैंने इसे IplImage में परिवर्तित करने का प्रयास किया है, लेकिन यह भी काम नहीं करता है। इसके अलावा, मैंने Google की कोशिश की है लेकिन मुझे एक समाधान समाधान नहीं मिला। मैं इसे 3 दिनों के लिए कोशिश कर रहा हूं।

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

जहां frame और face हैं cv::Mat

+0

एक चित्र बॉक्स में प्रदर्शित करने के लिए, आपको उस IplImage को बिटमैप में परिवर्तित करने की आवश्यकता है। – SinisterMJ

+0

क्या आप इसके लिए कोड की लाइन प्रदान कर सकते हैं? –

+0

मेरे पास बिटमैप बनाने के लिए केवल सी # कोड है। यह डेटा पॉइंटर (IplImage-> डेटाऑरिगिन) लेता है, और इसे आकार देने के लिए आकार लेता है। चूंकि पिक्चरबॉक्स वास्तव में एक सी # चीज है, इसलिए मैंने इसे सी ++ में उपयोग नहीं किया है। सी ++ के लिए मैं ओपनजीएल या डायरेक्टएक्स डिस्प्ले करने की सिफारिश करता हूं, क्योंकि यह इतना तेज़ है। – SinisterMJ

उत्तर

5

यहाँ किसी भी Windows प्रपत्र नियंत्रण पर OpenCV चटाई आकर्षित करने के लिए एक सी ++ CLR समारोह है:

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

यदि मैं गलत हूं, तो मुझे सही करें, लेकिन आपको 'ग्राफिक्स-> निपटान() का उपयोग करने की आवश्यकता नहीं है;' अंत में कॉल करने के बाद इसे ड्रॉ करने के बाद? ["इसके बजाय, आपको ग्राफिक्स ऑब्जेक्ट का उपयोग करने के लिए हर बार CreateGraphics को कॉल करना होगा, और फिर जब आप इसे समाप्त कर लेंगे तो निपटान करें।] (Https://msdn.microsoft.com/en-us/library/system। windows.forms.control.creategraphics (v = vs.110) .aspx) – kdbanman

+0

@kdbanman ... इसे इंगित करने के लिए धन्यवाद। मुझे इसके बारे में पता नहीं था। सी ++ सीएलआर में, हमें इसके बजाय 'हटाएं' ऑपरेटर को कॉल करना होगा 'Dispose'। – sgarizvi