image-processing - OpenCV: Blob 周围的轮廓不正确

标签 image-processing opencv contour blobs

我试图在二值图像中绘制 Blob 周围的轮廓,但是,有时,openCV 会在两个不同的 Blob 周围绘制一个轮廓。下面是一个例子。我该如何解决这个问题? alt text

这里应该为右侧的 Blob 绘制两个边界框,并分别为左侧的 Blob 绘制两个边界框。我同意它们很近,但它们之间有足够的距离。我只绘制外部轮廓而不是树或列表。我还使用 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></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;
</code></pre>

<p>}</p>

<p>int pplfind(CvContourScanner cscan, CvSize frSize){
    ofstream file; char buff[50];
    file.open("box.txt",ofstream::app);
    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>

<pre><code>        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;
</code></pre>

<p>}
</p>

最佳答案

我从未使用过cvFindNextContour,但是在您的图像上使用CV_RETR_EXTERNAL 运行cvFindContours 似乎工作正常:

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

关于image-processing - OpenCV: Blob 周围的轮廓不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4608255/

相关文章:

c - Matlab Coder 是否仅生成单线程 C 应用程序?

java - 如何使用java比较图像的相似性

python - 在python中裁剪图像

c++ - OpenCV - 查找对象形状

matlab - 有没有办法将网格线放在等高线图的顶部?

python - opencv2 中阈值 32 uint 图像的轮廓和凸包

image-processing - 最新版本的 grunt-contrib-imagemin 报告错误 'spawn ENOENT'?

c++ - 连接组件计数

matlab - 相机标定 MATLAB 工具箱

python - 使用 matplotlib.animate 在 python 中对等高线图进行动画处理