2016-01-19 2 views
0

Я пытаюсь обнаружить определенные движущиеся объекты в видео. Если любые два/три + прямоугольника перекрываются/пересекаются, я хочу, чтобы они меняли цвет. я пытался что-то вроде этого:Пересечение в массиве прямоугольников OpenCv

for (size_t i = 0; i < contours.size(); i++) 
     { 
      Scalar color = Scalar(0.0, 255.0, 0.0); 
      // intersection 
      original = boundRect[i]; 
       for (size_t j = 0; j < boundRect.size(); j++){ 
        if (j == i) continue; // the same rectangle 
        match = boundRect[j]; 
        if ((original & match).area() > 0) color = Scalar(0.0, 0.0, 255.0); 
        else color = Scalar(0.0, 255.0, 0.0); 
       } 
       // draw the rectangle 
       rectangle(frame, boundRect[i].tl(), boundRect[i].br(), color, 2, 8, 0); 
     } 

Это делает работу где-то, но теперь всегда. Я не знаю, правильно ли я делаю это, или если есть лучший способ сделать это.

+1

вы перезаписать цвет для каждого у ... только удалите случай else – Micka

+0

О да, вы правы. Задача решена. – Croolman

+1

@Micka Вы должны разместить это как ответ, чтобы вопрос отображался как ответ. – SSteve

ответ

1

Вы, кажется, вычислите, пересекается правильно, но вы только рисуете результаты один раз для каждого i. И если прямоугольник j не пересекает i, вы снова заново замените свой измененный цвет. Просто удалите футляр else для установки цвета, или помните, как (или часто) прямоугольник пересекает другой. Например:

for (size_t i = 0; i < contours.size(); i++) 
    { 
     int nIntersections = 0; 
     // intersection 
     original = boundRect[i]; 
      for (size_t j = 0; j < boundRect.size(); j++){ 
       if (j == i) continue; // the same rectangle 
       match = boundRect[j]; 
       if ((original & match).area() > 0) 
       { 
        nIntersections++; 
        // if you only want to know whether intersections appear or not, you can stop the inner for-loop here, by using j=boundRect.size(); continue; or break; 
       } 
      } 
      // draw the rectangle 
      cv::Scalar color(0,255,0); 
      if(nIntersections > 0) color = cv::Scalar(0,0,255); 
      // adjust for different 
      // if(nIntersections > 1) color = ... 
      rectangle(frame, boundRect[i].tl(), boundRect[i].br(), color, 2, 8, 0); 
      // for simplicity you can just call rectangle(frame, boundRect[i], color, 2, 8, 0); without getting top-left and bottom-right points first. cv::rectangle uses cv::Rect as a parameter directly if you like. 
    } 

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

Смежные вопросы