2013-04-24 8 views
5

मैं OpenCV के लिए नया हूँ और मैं पता लगाने के लिए वीडियो/छवि में एक विशेष क्षेत्र का चयन करना चाहते का चयन। मेरे मामले में मैं उन कारों का पता लगाना चाहता हूं जो केवल सड़क पर नहीं हैं बल्कि पार्किंग स्थल में हैं।एक क्षेत्र OpenCV

उत्तर

8

ठीक है, कारों का चयन करने के लिए प्रशिक्षण डेटा का उपयोग करना आवश्यक है। लेकिन एक लागत पर लाभ को चुनने के लिए (ब्याज की क्षेत्र) काफी सरल है:

पर विचार करें img = cv2.imread(image)

उस मामले में, कहीं न कहीं अपने कोड में, यदि आप किसी क्षेत्र इस तरह से निर्दिष्ट कर सकते हैं:

sub_image = img[y:y+h, x:x+w] 

कि एक बार जब आप मान निर्दिष्ट करते हैं तो ROI प्राप्त करें, ज़ाहिर है, 'x' या 'y' का उपयोग न करें, जहां एच ऊंचाई है और w चौड़ाई है। याद रखें कि छवियां केवल 2 डी matrices हैं।

उपयोग CascadeClassifier() छवि (ओं) से कार (रों) का चयन करें। दस्तावेज़ीकरण here पाया गया है। ओपनसीवी प्रशिक्षण डेटा के साथ पैक आता है जिसका उपयोग आप एक्सएमएल फाइलों के रूप में वर्गीकरण करने के लिए कर सकते हैं।

7

आप मैन्युअल रूप से ब्याज (आरओआई) के एक क्षेत्र का चयन करने के लिए उस पर कुछ प्रसंस्करण क्या करना चाहते हैं, तो आप शुरुआत का चयन करें और अपनी लागत पर लाभ के बिंदु को रोकने के लिए माउस क्लिक करें घटना का उपयोग कर की कोशिश कर रहा हो सकता है।

एक बार जब आप शुरू करने और रोकने के बिंदु आपके द्वारा चयनित क्षेत्र से छवि को पुनः प्राप्त करने के लिए इसका इस्तेमाल कर सकते हैं।

छवि या कब्जा वीडियो फ्रेम पर किया जा सकता।

bool roi_captured = false; 
Point pt1, pt2; 
Mat cap_img; 
//Callback for mousclick event, the x-y coordinate of mouse button-up and button-down 
//are stored in two points pt1, pt2. 
void mouse_click(int event, int x, int y, int flags, void *param) 
{ 

    switch(event) 
    { 
     case CV_EVENT_LBUTTONDOWN: 
     { 
      std::cout<<"Mouse Pressed"<<std::endl; 

      if(!roi_capture) 
      { 
       pt1.x = x; 
       pt1.y = y; 
      } 
      else 
      { 
       std::cout<<"ROI Already Acquired"<<std::endl; 
      } 
     break; 
     } 
     case CV_EVENT_LBUTTONUP: 
     { 
      if(!got_roi) 
     { 
      Mat cl; 
      std::cout<<"Mouse LBUTTON Released"<<std::endl; 

      pt2.x = x; 
      pt2.y = y; 
      cl = cap_img.clone(); 
      Mat roi(cl, Rect(pt1, pt2)); 
      Mat prev_imgT = roi.clone(); 
      std::cout<<"PT1"<<pt1.x<<", "<<pt1.y<<std::endl; 
      std::cout<<"PT2"<<pt2.x<<","<<pt2.y<<std::endl; 

      imshow("Clone",cl); 

      got_roi = true; 
     } 
     else 
     { 
      std::cout<<"ROI Already Acquired"<<std::endl; 
     } 
     break; 
     } 

    } 

} 
//In main open video and wait for roi event to complete by the use. 
// You capture roi in pt1 and pt2 you can use the same coordinates for processing // //subsequent frame 
int main(int argc, char *argv[]) 
{ 
    int frame_num = 0; 
    int non_decode_frame =0; 
    int count = 1, idx =0; 
    int frame_pos =0; 

    std::cout<<"Video File "<<argv[1]<<std::endl; 

    cv::VideoCapture input_video(argv[1]); 

    namedWindow("My_Win",1); 

    cvSetMouseCallback("My_Win", mouse_click, 0); 

    sleep(1); 

    while(input_video.grab()) 
    { 
     cap_img.release(); 

     if(input_video.retrieve(cap_img)) 
     { 
      imshow("My_Win", cap_img); 
      if(!got_roi) 
      { 
          //Wait here till user select the desire ROI 
       waitKey(0); 
      } 
      else 
      { 
       std::cout<<"Got ROI disp prev and curr image"<<std::endl; 
       std::cout<<"PT1"<<pt1.x<<" "<<pt1.y<<std::endl; 
       std::cout<<"PT2"<<pt2.x<<" "<<pt2.y<<std::endl; 

       Mat curr_img_t1; 
       Mat roi2(cap_img,Rect(pt1, pt2)); 
       Mat curr_imgT = roi2.clone(); 
       cvtColor(curr_imgT, curr_img_t1, CV_RGB2GRAY); 

        imshow("curr_img", curr_img); 

      // Do remaining processing here on capture roi for every frame 
           waitKey(1); 
         } 
        } 
} 
}