2012-07-03 1 views
2

Я пытаюсь подсчитать количество ненулевых пикселей в контуре, полученном из изображения Canny edged с использованием openCV (с использованием C). Я использую cvFindNextContour, чтобы найти следующий контур, полученный с помощью контурного сканера.Ошибка при использовании cvCountNonZero в opencv

Но когда я использую 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.First сделать прямоугольную область вокруг каждого контура.

2.Установите изображение ROI в этот конкретный регион.

3. Теперь используйте cvCountNonZero(); чтобы найти число не нулей в Регионе.

4.Reset image ROI.

Успешное кодирование.

+0

Спасибо, это помогло много .. :) Но не могли бы вы рассказать мне, как полностью заключить контур в прямоугольник. Я имею в виду, что замкнутый прямоугольник вокруг контура горизонтальный или вертикальный. Так что, если контур наклонный. Кажется, что прямоугольник заключает только половину контура. Есть ли способ, которым я могу заключить его с помощью многоугольника и найти его область? Благодаря! – bluechill

+0

проверить функцию cvContourArea() в opencv Справочное руководство для поиска области. – G453

Смежные вопросы