2012-07-03 50 views
2

我正在嘗試使用openCV(使用C)從Canny邊緣圖像中檢索輪廓中非零像素的數目。我正在使用cvFindNextContour來查找使用輪廓掃描儀檢索的後續輪廓。在opencv中使用cvCountNonZero時出錯

但是當我使用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)); 

} 

任何形式的幫助是高度讚賞。提前致謝。

回答

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。

祝您編程愉快。

+0

感謝它幫了很多.. :) 但你能告訴我如何將一個輪廓完全包圍在一個矩形。我的意思是圍繞輪廓的封閉矩形可以是水平的也可以是垂直的。那麼如果輪廓是傾斜的呢?矩形看起來只包圍了一半輪廓。有沒有什麼辦法可以用多邊形把它包圍起來並找到它的面積?謝謝! – bluechill

+0

在opencv Ref手冊中查看cvContourArea()函數以查找該區域。 – G453

相關問題