Согласно документации, функция 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/