OpenCV группировка белых пикселей - PullRequest
7 голосов
/ 04 марта 2010

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

альтернативный текст

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

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

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

Большое спасибо заранее!
tommed

Ответы [ 2 ]

8 голосов
/ 04 марта 2010

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

4 голосов
/ 04 марта 2010

Да, вы можете сделать это с 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 в качестве официальной библиотеки обнаружения BLOB-объектов.

...