2

我正在尝试使用openCV(使用C)计算从Canny边缘图像中检索到的轮廓中非零像素的数量。我正在使用 cvFindNextContour 来查找使用轮廓扫描仪检索到的后续轮廓。

但是当我在轮廓上使用 cvCountNonZero 时,会出现错误:

Bad flag (parameter or structure field) (Unrecognized or unsupported array type)
in function cvGetMat, C:\User\..\cvarray.cpp(2881)

我的代码是:

cvCvtColor(image, gray, CV_BGR2GRAY);
cvCanny(gray, edge, (float)edge_thresh, (float)edge_thresh*4, 3);

sc = cvStartFindContours( edge, mem,
                          sizeof(CvContour),
                          CV_RETR_LIST,
                          CV_CHAIN_APPROX_SIMPLE,
                          cvPoint(0,0) );

while((contour = cvFindNextContour(sc))!=NULL)
{
               CvScalar color = CV_RGB( rand()&255, rand()&255, rand()&255 );
               printf("%d\n",cvCountNonZero(contour));
               cvDrawContours(final, contour, color, CV_RGB(0,0,0), -1, 1, 8, cvPoint(0,0));

}

任何形式的帮助都将受到高度赞赏。提前致谢。

4

1 回答 1

2

cvCountNonZero(CvArr*) 用于查找数组或 IplImage 中非零的数量,但不适用于 CvSeq* 轮廓类型。这就是错误来的原因。这里是问题的解决方案。

        CvRect rect = cvBoundingRect( contour, 0);
        cvSetImageROI(img1,rect);
        cout<<cvCountNonZero(img1)<<endl;
        cvResetImageROI(img1);
//where img1 is the binary image in which you find the contours.

代码可以用以下方式解释:

1.首先在每个轮廓周围制作一个矩形区域。

2.将图像 ROI 设置为该特定区域。

3.现在使用 cvCountNonZero(); 函数查找区域中非零的数量。

4.重置图像ROI。

祝您编码愉快。

于 2012-07-03T11:27:36.490 回答