Несоответствие количества обнаруженных контуров в OpenCV - PullRequest
1 голос
/ 17 мая 2011

Согласно документации, функция cvFindContours() возвращает количество найденных контуров из двоичного входного изображения. Однако, когда я запускаю петлю по всем контурам, количество обнаруженных контуров значительно меньше.

Возможной причиной может быть то, что в возвращаемом значении функции учитываются дочерние контуры родителя, а также отверстия. Даже при том, что это число не соответствует разумной оценке глаз используемых мной картин.

В этом случае возвращаемое значение равно 92, тогда как при обходе всех контуров имеется 15 различных контуров.

Вот код:

int n = cvFindContours(img_canny_mop, mem, &contours, sizeof(CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));
printf("No of retrieved contours = %d",n);
for (ptr = contours; ptr != NULL; ptr = ptr->h_next) 
{
        ext_color = CV_RGB( rand()&255, rand()&255, rand()&255 ); //randomly coloring different contours
        cvDrawContours(cc_color, ptr, ext_color, CV_RGB(0,0,0), -1, CV_FILLED, 8, cvPoint(0,0));          
        //display( cc_color, "CCs");
        n_cont++;
}
cvSaveImage("CC_colors.jpg",cc_color);
printf("\nNo of contours = %d",n_cont);

Изображения:

Ввод: http://imageshack.us/photo/my-images/811/cannymop.jpg/

Случайно окрашенные контуры: http://imageshack.us/photo/my-images/819/cccolors.jpg/

1 Ответ

0 голосов
/ 17 мая 2011

Вы можете посмотреть документацию здесь . Ключевая часть заключается в следующем.

Указатель firstContour заполняется функция. Будет содержать указатель на первый самый внешний контур или NULL, если контуры не обнаружены (если изображение полностью черное). Другой контуры могут быть достигнуты от firstContour с использованием h_next и v_next ссылки.

Может быть, вам нужно проверить номер v_next для каждого h_next (или наоборот).

...