cvFindContours()无法检测到独立的组件

3

我正在尝试查找图像小区域内存在的连通组件(如果有)。但是cvFindContours()函数将明显分离的组件分组为一个单一组件,从而使进一步计算不正确。

如何获取区域内的单独组件?(将不同颜色的组件作为函数检测到的内容)。

以下是代码:

    IplImage* cc_img = cvCreateImage( cvGetSize(src), src->depth, 3 );
cvSetZero(cc_img);
CvScalar(ext_color);

CvMemStorage *mem;
mem = cvCreateMemStorage(0);
CvSeq *contours = 0;
CvSeq *ptr;
int n_cont = 0;
int n = cvFindContours( src, mem, &contours, sizeof(CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));

for (ptr = contours; ptr != NULL; ptr = ptr->h_next) 
{
    n_cont++;

    ext_color = CV_RGB( rand()&255, rand()&255, rand()&255 ); //randomly coloring different contours
    cvDrawContours(cc_img, ptr, ext_color, CV_RGB(0,0,0), -1, CV_FILLED, 8, cvPoint(0,0));        
}

输入图像描述

“CEL”被认为是单个组件!

2个回答

3

我不使用OpenCV,但经过Mathematica验证,您可能需要指定只有通过顶部、底部、左侧和右侧相邻的两个组件才被连接。如果考虑完整的8个相邻点,则所有三个字母都将被连接,如您所示:

comp = MorphologicalComponents[img, CornerNeighbors -> False];
Colorize[comp]

enter image description here


基本上将八连通改为四连通邻居。好的,我会看看是否有一种修改CvFindContours这样的方法。 - AruniRC

1

在运行cvFindContours之前,尝试应用一些形态学滤波器,例如cvErodecvMorphologyEx(...,CV_MOP_OPEN)来扩大字母之间的距离。


如果这样做会扭曲字母本身,那么后续的代码就无法正常工作了。虽然可以尝试使用细化操作来解决问题。...有没有办法修改cvFindContours()函数使其正确检测? - AruniRC
1
我不知道...我遇到了类似的问题,并通过在腐蚀图像上找到连接组件,然后返回并在原始图像中屏蔽像素,并在掩蔽图像上重新运行cvFindContours()来解决它。 - jeff7
现在听起来不错;我正在处理。您能详细说明一下回溯和掩蔽的情况吗?哪些像素在原始图像中被掩蔽了? - AruniRC
你好,你找到解决问题的答案了吗?我也遇到了同样的问题,不知道该怎么办了。请帮帮我! - Ekta

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