OpenCV группировка белых пикселей


Я проделал тяжелую работу, превратив свою камеру iSight на MacBook в инфракрасную камеру, преобразовал ее, установил порог и т. д.. а теперь есть изображение, которое выглядит примерно так:

Alt text

Теперь моя проблема: мне нужно знать, сколько пятен на моем изображении, группируя белые пиксели. Я не хочу использовать cvBlob/cvBlobsLib, я бы предпочел просто использовать то, что уже есть в OpenCV.

Я могу перебирать пиксели и группировать их, проверяя на наличие (порог) касаясь белых пикселей, но я предполагаю, что есть, вероятно, действительно простой способ сделать это из OpenCV?

Я предполагаю, что я не могу использовать cvFindContours, так как это будет извлекать все белые пиксели в одном большом массиве, а не разделять их на "группы". Может кто-нибудь посоветовать? (Обратите внимание, что это не круги, а просто свет, излучаемый маленькими ИК-светодиодами)

Заранее большое спасибо!
томмед

2   7  

2 ответа:

Петля по изображению в поисках белых пикселей. Когда вы сталкиваетесь с одним из них, вы используете cvFloodFill с этим пикселем в качестве затравки. Затем увеличьте значение заливки для каждой области, чтобы каждая область имела свой цвет. Это называется маркировкой.

Да, вы можете сделать это с помощью cvFindContours(). Он возвращает указатель на первую найденную последовательность. Используя этот указатель, вы можете пройти через все найденные последовательности.

    // your image converted to grayscale
    IplImage* grayImg = LoadImage(...);

    // image for drawing contours onto
    IplImage* colorImg = cvCreateImage(cvGetSize(grayImg), 8, 3);

    // memory where cvFindContours() can find memory in which to record the contours
    CvMemStorage* memStorage = cvCreateMemStorage(0);

    // find the contours on image *grayImg*
    CvSeq* contours = 0;
    cvFindContours(grayImg, memStorage, &contours);

    // traverse through and draw contours
    for(CvSeq* c = contours; c != NULL; c = c->h_next) 
    {
         cvCvtColor( grayImg, colorImg, CV_GRAY2BGR );
         cvDrawContours(
                        colorImg,
                        c,
                        CVX_RED,
                        CVX_BLUE,
                        0, // Try different values of max_level, and see what happens
                        2,
                        8
         );
    }
Помимо этого метода, я бы посоветовал вам взглянуть на cvBlobs или cvBlobsLib. Последний интегрирован в OpenCV 2.0 как официальный lib обнаружения blob-объектов.