我的问题程序如下 int mode = CV_RETR_TREE;//设置提取轮廓模式
int contours_num=0;//提取轮廓的数目
CvScalar external_color;//绘制轮廓线的颜色
CvScalar hole_color;
CvMemStorage *storage1 = cvCreateMemStorage(0);
CvSeq *contours =0;//存储提取的轮廓图像
IplImage *imgotl = cvCreateImage(cvGetSize(img2),8,1);//显示提取的轮廓图像
cvZero(imgotl);
contours_num=cvFindContours(img2,storage1,&contours,sizeof(CvContour),mode,CV_CHAIN_APPROX_NONE);
for (;contours!=0;contours=contours->h_next)
{
hole_color=CV_RGB(rand()&255,rand()&255,rand()&255);
external_color = CV_RGB(rand()&255,rand()&255,rand()&255);
cvDrawContours(imgotl,contours,external_color,hole_color,1,2,8,cvPoint(0, 0));
}
cvNamedWindow("otl",0);
cvShowImage("otl",imgotl);
cvReleaseMemStorage(&storage1);
cvWaitKey();
}
此段程序前进行了中值滤波和二值化。 我要提取最外层的轮廓,用的模式是CV_RETR_TREE(其他模式不能单独显示最外层轮廓),可是绘制轮廓的时候如果参数max_level选1的话显示出来一片黑,选2的话才是最外层轮廓,选6时出现全部内外轮廓,中间的取值没试过,而网上说的是选1出现第一级轮廓即最外层。这里我选择max_level=2,然后下一步引用contours点集绘制最小外接圆的函数cvMinEnclosingCircle(这里没有列出),这时程序报错assertion failed<arr!=0&&contour_header!=0&&block!=0>in cvpointseqfrommat,file.........utils.cpp。我想可能是contours没有指向最外层所以cvMinEnclosingCircle没有读取到最外层的点集,不知道该怎么样解决这个问题。
|