bluechill
bluechill

Reputation: 437

Error using cvCountNonZero in opencv

I am trying to count the number of non-zero pixels in a contour retrieved from a Canny edged image using openCV (using C). I am using cvFindNextContour to find the subsequent contour retrieved using a contour scanner.

But When I use the cvCountNonZero on the contour, an error shows up:

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

My code is:

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));

}

Any kind of help is highly appreciated. Thanks in advance.

Upvotes: 2

Views: 1746

Answers (1)

G453
G453

Reputation: 1456

cvCountNonZero(CvArr*) is for finding the number of non zeros in an array or IplImage but not for CvSeq* contour type. That is why the error is coming. Here teh solution to the problem.

        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.

The code can be explained in the following way:

1.First make a rectangular region around each contour.

2.Set the image ROI to that particular region.

3.Now use the cvCountNonZero(); function to find the number of non zeros in the Region.

4.Reset the image ROI.

Have a happy coding.

Upvotes: 2

Related Questions