2013-12-23 2 views
1

друзья, я кодирую с помощью opencv. Я хочу найти три больших контура в картинке/видео, у меня есть код, который может найти два больших контура, мне трудно найти третий по величине, поэтому мне нужны ваши предложения, с Рождеством! Вот мой основной код, как его изменить.Найдите три самых больших контура (доведите до двух)

CvSeq *cont = 0 
cvFindContours(tempImg, storage, &cont, sizeof(CvContour), 
CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0)); 

CvSeq *contmax = 0; 
CvSeq *contmax2 = contmax; 

for(;cont;cont = cont->h_next) //get the two max area, and mark 
{ 
    area = fabs(cvContourArea(cont, CV_WHOLE_SEQ)); 
    printf("area == %lf\n", area); 
    if(area > maxArea) 
    { 
     contmax2 = contmax; 
     max2Area = maxArea; 
     contmax = cont; 
     maxArea = area; 
    } 
    else if(area > max2Area && area < maxArea) 
    { 
     contmax2 = cont; 
     max2Area = area; 
    } 

} 
CvRect aRect = cvBoundingRect(contmax, 0); 
CvRect bRect = cvBoundingRect(contmax2, 0); 
+0

Можете ли вы дать нам пример ввода и вывода и способ компилировать и выполнять сами свою программу? –

+0

О, это очень длинный код, я пишу программу для видения робота. Я скомпилирую его с помощью gcc в Linux. вы можете принять tempImg в качестве входных данных. – Dashu

+1

Было бы очень полезно, чтобы мы могли скомпилировать что-то, чтобы мы могли его отлаживать. –

ответ

2

Что об этом ?:

#define N 3 

double maxArea[N] = {0}; 
CvSeq *countours[N], *tmp_cont; 
double tmp_area; 

for(;cont;cont = cont->h_next) 
{ 
    area = fabs(cvContourArea(cont, CV_WHOLE_SEQ)); 
    printf("area == %lf\n", area); 

    for(int i = N-1; i >= 0; --i) 
    { 
     if(area > maxArea[i]) 
     { 
      maxArea[i] = area; 
      countours[i] = cont; 
      for(int j = (i-1); j >= 0; --j) 
      { 
       if(maxArea[j] < maxArea[j+1]) 
       { 
        tmp_area = maxArea[j+1]; 
        tmp_cont = contours[j+1]; 
        maxArea[j+1] = maxArea[j]; 
        contours[j+1] = contours[j]; 
        maxArea[j] = tmp_area; 
        contours[j] = tmp_cont; 
       } 
      } 
      break; 
     } 
    } 

} 
+0

Привет, Фауст, количество всех контуров около 20, теперь мне нужно найти три больших контура. Согласно вашему коду, контуры [0], контуры [1] и контуры [2] являются тремя наибольшими контурами, верно? – Dashu

+0

Да, вы правы. – smeso

+0

Хорошая стратегия! Я иду попробовать сейчас, Thx! – Dashu

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