OpenCV, группирующий белые пиксели

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

сопроводительный текст

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

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

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

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

7
задан Angie Quijano 15 March 2016 в 15:58
поделиться

2 ответа

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

8
ответ дан 6 December 2019 в 21:12
поделиться

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

4
ответ дан 6 December 2019 в 21:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: