2013-04-24 3 views
5

Я новичок в OpenCV, и я хочу выбрать конкретный регион в видео/изображении для обнаружения. В моем случае я хочу обнаружить автомобили, которые находятся только на дороге, а не на стоянке.Выбор региона OpenCV

ответ

8

Ну, выбор автомобилей требует использования данных обучения. Но для выбора ROI (область интереса) достаточно прост:

Рассмотрим img = cv2.imread(image)

В этом случае, где-то в вашем коде, вы можете указать регион, таким образом:

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

Это будет получить ROI, как только вы укажете значения, конечно, не используя «x» или «y», где h - высота, а w - ширина. Помните, что изображения представляют собой только 2D-матрицы.

Используйте CascadeClassifier() чтобы выбрать автомобиль (ы) с изображений. Документация найдена here. OpenCV поставляется с данными обучения, которые вы можете использовать для создания классификаций в виде файлов XML.

7

Если вы хотите вручную выбрать интересующую область (ROI), чтобы выполнить некоторую обработку на ней, вы можете попробовать использовать событие щелчка мыши, чтобы выбрать точки старта и остановки вашего ROI.

После того, как у вас есть точка начала и остановки, вы можете использовать ее для извлечения изображения из выбранного региона.

Можно сделать на изображении или захватить видеокадр.

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); 
         } 
        } 
} 
} 
Смежные вопросы