如何使用OpenCV将细线提取为单独的轮廓/连通组件?

3

我已经在一张图片上使用了距离变换细化算法。现在正在尝试分别提取每个连接的组件 - 如果有两条细线,则应该检测到三个这样的单独线条和组件。

/*finding contours*/
IplImage *cc_color; 
cc_color = cvCreateImage(cvGetSize(thin_img), IPL_DEPTH_8U, 3);


    CvMemStorage *mem;
mem = cvCreateMemStorage(0);


int count = 0;
char* ch = new char [2];

CvSeq *contours = 0;

  CvSeq *ptr;
/*finding contours of morphed image*/
cvFindContours(thin_img, mem, &contours, sizeof(CvContour), CV_RETR_CCOMP,       CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));

    /*all contours on one image - random coloring*/
for (ptr = contours; ptr != NULL; ptr = ptr->h_next) 
    {
            CvScalar ext_color = CV_RGB( rand()&255, rand()&255, rand()&255 ); /*randomly coloring different contours*/
            cvDrawContours(cc_color, ptr, ext_color, CV_RGB(0,0,0), -1, CV_FILLED, 8, cvPoint(0,0));          
    }

thin_image是输入。输出应该将每行随机着色为不同的轮廓/组件。然而,它只能检测封闭的形状作为轮廓。如何将线条检测为组件?
输出图像:Input image
输入图像:enter image description here
红色框示例部分表示应该被检测为组件的部分。但是只有封闭的形状被检测到。
1个回答

3

如果你想要将线条/边框作为组件而不是内部区域,那么在应用findContours之前,你应该先反转thin_image(黑色变白色,白色变黑色)。


谢谢。这次有效了。这是我之前出错的原因吗——因为细线是黑色的,所以cvFindContours()把它们看作边界而不是对象?反转后,它们被视为对象而不再是边界。我希望推理清晰,以便以后开发,请解释一下。 - AruniRC
是的,黑色代表“边界”,白色代表“物体”。 - etarion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接