OpenCV中的Blob提取

amr*_*amr 13 c++ opencv blob codeblocks

我正在使用OpenCV来过滤某些颜色的图像,所以我得到了检测区域的二进制图像.

现在我想侵蚀那些区域,然后摆脱较小的区域,找到最大'blob'的x,y坐标

我一直在寻找有关最佳图书馆使用方法的建议?我见过cvBlob和cvBlobsLib,但我不太清楚如何设置它们.我是否想要将它们与项目一起编译,或者我是否要将它们编译并安装到系统中(就像我使用OpenCV一样)?

我目前正在Ubuntu上使用Code :: Blocks IDE(虽然这不应该限制事情)

eta*_*ion 11

您可以使用它findContours来执行此操作,请参阅opencv手册查找连接组件教程.


编辑:教程中的代码(通过Archive.org)

#include <stdio.h>
#include <cv.h>
#include <highgui.h>

int main(int argc, char *argv[])
{
    IplImage *img, *cc_color; /*IplImage is an image in OpenCV*/
    CvMemStorage *mem;
    CvSeq *contours, *ptr;
    img = cvLoadImage(argv[1], 0); /* loads the image from the command line */
    cc_color = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 3);

    cvThreshold(img, img, 150, 255, CV_THRESH_BINARY);
    mem = cvCreateMemStorage(0);
    cvFindContours(img, mem, &contours, sizeof(CvContour), CV_RETR_CCOMP,
        CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));


    for (ptr = contours; ptr != NULL; ptr = ptr->h_next) {
        CvScalar color = CV_RGB( rand()&255, rand()&255, rand()&255 );
        cvDrawContours(cc_color, ptr, color, CV_RGB(0,0,0), -1, CV_FILLED, 8, cvPoint(0,0));
    }

    cvSaveImage("result.png", cc_color);
    cvReleaseImage(&img);
    cvReleaseImage(&cc_color);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)


Jas*_*ton 11

我已经迟到了,但我只是想说明有一种方法可以在opencv中进行连接组件,它还没有主流.

更新:它是主流,它只是等待3.0发布多年. 链接到文档

http://code.opencv.org/issues/1236http://code.opencv.org/attachments/467/opencv-connectedcomponents.patch

免责声明 - 我是作者.

  • 干得好杰森.我已经集成了你的补丁,它似乎运作良好.速度也很好.也许添加一些属性函数也会很棒(比如area,centroïd等).无论如何,感谢伟大的工作.我希望OpenCV团队尽快整合你的补丁.这是一个严重缺乏OpenCV恕我直言,特别是因为其他库已经过时,只使用IplImage*... (2认同)

Pau*_*l R 10

不幸的是,OpenCV没有任何连接组件标签功能,这似乎是计算机视觉库的一个严重遗漏.无论如何,我最近有类似的要求,所以我实现了自己的CCL例程 - 在CCL维基百科页面上描述了几种不同的算法,它们都很容易实现.