2013-04-24 40 views
5

Tôi mới sử dụng OpenCV và tôi muốn chọn một khu vực cụ thể trong video/hình ảnh để phát hiện. Trong trường hợp của tôi, tôi muốn phát hiện những chiếc xe chỉ ở trên đường không có trong bãi đậu xe.Chọn một khu vực OpenCV

Trả lời

8

Vâng, việc chọn ô tô yêu cầu sử dụng dữ liệu đào tạo. Tuy nhiên, để chọn một ROI (vùng quan tâm) là khá đơn giản:

Cân nhắc img = cv2.imread(image)

Trong trường hợp đó, ở đâu đó trong mã của bạn, bạn có thể chỉ định một khu vực như sau:

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

Đó sẽ nhận được ROI khi bạn chỉ định các giá trị, tất nhiên, không sử dụng 'x' hoặc 'y', trong đó h là chiều cao và w là chiều rộng. Hãy nhớ rằng hình ảnh chỉ là ma trận 2D.

Sử dụng CascadeClassifier() để chọn (các) xe từ (các) hình ảnh. Tài liệu được tìm thấy here. OpenCV được đóng gói với dữ liệu đào tạo mà bạn có thể sử dụng để tạo phân loại ở dạng tệp XML.

7

Nếu bạn muốn chọn khu vực quan tâm (ROI) theo cách thủ công để thực hiện một số xử lý, bạn có thể thử sử dụng sự kiện nhấp chuột để chọn điểm bắt đầu và điểm dừng của ROI.

Khi bạn đã bắt đầu và dừng điểm, bạn có thể sử dụng nó để truy xuất hình ảnh từ khu vực được chọn.

Có thể thực hiện trên hình ảnh hoặc chụp khung hình video.

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); 
         } 
        } 
} 
} 
Các vấn đề liên quan