根据文档,函数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/
您可能需要在此处查看文档。关键部分如下。
指针第一轮廓由函数。它将包含指针到第一个最外层的轮廓或如果未检测到轮廓,则为 NULL(如果图像完全是黑色的)。其他轮廓可以从first使用h_next和v_next的轮廓链接。
您可能需要检查每个h_next的v_next数(反之亦然)。