OpenCV: неправильный контур вокруг капель - PullRequest
2 голосов
/ 05 января 2011

Я пытаюсь нарисовать контуры вокруг больших двоичных объектов в двоичном изображении, однако иногда openCV рисует один контур вокруг двух различных больших двоичных объектов.Ниже приведен пример.Как я могу решить эту проблему?alt text

Здесь следует нарисовать два ограничивающих прямоугольника для большого двоичного объекта справа и отдельно для одного левого.Я согласен, что они близко, но между ними достаточно расстояния.Я рисую только внешние контуры вместо дерева или списка.Я также использую cvFindNextContour (contourscanner), поскольку это проще для моего случая.

Спасибо

РЕДАКТИРОВАТЬ: Изображение, отображаемое в окне «Вывод» из другой функции, котораявычитание изображения.Изображение, отображаемое в окне «Контуры», находится в функции pplfind ().«выходное» изображение передается в img_con ().


IplImage* img_con(IplImage* image){
    int ppl;
    CvMemStorage* memstr = cvCreateMemStorage();
    IplImage* edges = cvCreateImage(cvGetSize(image),8,1);
    cvCanny(image,edges,130,255);
    CvContourScanner cscan = cvStartFindContours(image,memstr,sizeof(CvContour),CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE,cvPoint(0,0));</p>

<pre><code>ppl = pplfind(cscan,cvGetSize(image));
if (ppl !=0 )
    printf("Estimated number of people: %d\n",ppl);
cvEndFindContours(&cscan);
cvClearMemStorage(memstr);

return edges;

}

int pplfind (CvContourScanner cscan, CvSize frSize) {ofstream file;полукокса [50];file.open ( "box.txt", ofstream :: приложение);int ppl = 0;CvSeq * c;IplImage * out = cvCreateImage (frSize, 8,3);while (c = cvFindNextContour (cscan)) {CvRect box = cvBoundingRect (c, 1);if ((box.height> int (box.width * 1.2)) && (box.height> 20)) {// && (box.width <20)) {// ppl ++;cvRectangle (out, cvPoint (box.x, box.y), cvPoint (box.x + box.width, box.y + box.height), CV_RGB (255,0,50), 1); </p>

        cvShowImage("contours",out);
        //cvWaitKey();
    }
    //printf("Box Height: %d , Box Width: %d ,People: %d\n",box.height,box.width,ppl);
    //cvWaitKey(0);
    int coord = sprintf_s(buff,"%d,%d,%d\n",box.width,box.height,ppl);
    file.write(buff,coord);
}
file.close();
cvReleaseImage(&out);
return ppl;

}

1 Ответ

2 голосов
/ 10 января 2011

Я никогда не использовал cvFindNextContour, но запуск cvFindContours с CV_RETR_EXTERNAL на вашем изображении, кажется, работает нормально:

alt text

Я использую OpenCV + Python, поэтому этот код может быть вам не полезен, но для полноты здесь он звучит так:

contours = cv.FindContours(img, cv.CreateMemStorage(0), mode=cv.CV_RETR_EXTERNAL)
while contours:
    (x,y,w,h) = cv.BoundingRect(contours)
    cv.Rectangle(colorImg, (x,y), (x+w,y+h), cv.Scalar(0,255,255,255))
    contours = contours.h_next()

Редактировать: вы спрашивали, как рисовать только те контуры с определенными свойствами; это было бы что-то вроде этого:

contours = cv.FindContours(img, cv.CreateMemStorage(0), mode=cv.CV_RETR_EXTERNAL)
while contours:
    (x,y,w,h) = cv.BoundingRect(contours)
    if h > w*1.2 and h > 20:
        cv.Rectangle(colorImg, (x,y), (x+w,y+h), cv.Scalar(0,255,255,255))
    contours = contours.h_next()
...