cvFindContours () не обнаруживает отдельные компоненты - PullRequest
3 голосов
/ 03 августа 2011

Я пытаюсь найти связанные компоненты, присутствующие (если они есть) в небольшой области изображения. Однако функция 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 ]

3 голосов
/ 03 августа 2011

Я не использую OpenCV, но я подтвердил с помощью Mathematica, что вы, вероятно, хотите указать, что два компонента должны быть подключены только через своих верхних, нижних, левых и правых соседей.Если вы рассматриваете полных 8 соседей, то все три буквы связаны, как вы показали:

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

enter image description here

1 голос
/ 03 августа 2011

Попробуйте применить некоторую морфологическую фильтрацию, например cvErode или cvMorphologyEx(..., CV_MOP_OPEN), чтобы увеличить расстояние между буквами перед запуском cvFindContours.

...