cvFindContours()没有检测到单独的组件

时间:2011-08-03 06:15:45

标签: image-processing opencv

我正在尝试在图像的一个小区域内找到存在的连接组件(如果有的话)。但是,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));        
}

enter image description here

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

2 个答案:

答案 0 :(得分:3)

我不使用OpenCV,但我向Mathematica验证您可能希望指定两个组件只能通过它们的顶部,底部,左侧和右侧邻居连接。如果您考虑完整的8个邻居,那么所有三个字母都会连接起来,如您所示:

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

enter image description here

答案 1 :(得分:1)

在运行cvErode之前,尝试应用某些形态过滤,例如cvMorphologyEx(..., CV_MOP_OPEN)cvFindContours来扩展字母之间的距离。