Извлечение BLOB-объектов в OpenCV - PullRequest
13 голосов
/ 10 января 2011

Я использую OpenCV для фильтрации изображения по определенным цветам, поэтому у меня есть двоичное изображение обнаруженных областей.

Теперь я хочу стереть эти области, а затем избавиться от более мелких.и найдите координаты x, y самого большого «большого двоичного объекта»

Я искал рекомендации относительно того, какую библиотеку лучше всего использовать?Я видел cvBlob и cvBlobsLib, но я не слишком уверен, как их настроить.Хочу ли я скомпилировать их вместе с проектом или хочу скомпилировать и установить их в систему (как я это делал с OpenCV)?

В настоящее время я использую IDE Code :: Blocks в Ubuntu (хотя это не должно ограничивать вещи)

Ответы [ 4 ]

11 голосов
/ 12 апреля 2012

Я опаздываю на вечеринку, но я просто хотел бы сказать, что в opencv есть способ создавать подключенные компоненты, но он пока не поддерживается.

Обновление: оно есть,он просто застрял в ожидании релиза 3.0 в течение нескольких лет. Ссылка на документацию

См. http://code.opencv.org/issues/1236 и http://code.opencv.org/attachments/467/opencv-connectedcomponents.patch

Отказ от ответственности - я автор.

11 голосов
/ 10 января 2011

Для этого можно использовать findContours, см. Руководство opencv и учебник , чтобы найти подключенные компоненты .


Редактировать: код из учебника (через Archive.org)

#include <stdio.h>
#include <cv.h>
#include <highgui.h>

int main(int argc, char *argv[])
{
    IplImage *img, *cc_color; /*IplImage is an image in OpenCV*/
    CvMemStorage *mem;
    CvSeq *contours, *ptr;
    img = cvLoadImage(argv[1], 0); /* loads the image from the command line */
    cc_color = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 3);

    cvThreshold(img, img, 150, 255, CV_THRESH_BINARY);
    mem = cvCreateMemStorage(0);
    cvFindContours(img, mem, &contours, sizeof(CvContour), CV_RETR_CCOMP,
        CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));


    for (ptr = contours; ptr != NULL; ptr = ptr->h_next) {
        CvScalar color = CV_RGB( rand()&255, rand()&255, rand()&255 );
        cvDrawContours(cc_color, ptr, color, CV_RGB(0,0,0), -1, CV_FILLED, 8, cvPoint(0,0));
    }

    cvSaveImage("result.png", cc_color);
    cvReleaseImage(&img);
    cvReleaseImage(&cc_color);
    return 0;
}
10 голосов
/ 10 января 2011

К сожалению, OpenCV не имеет никаких функций маркировки подключенных компонентов, что кажется серьезным упущением для библиотеки компьютерного зрения.В любом случае, недавно у меня было похожее требование, поэтому я реализовал свою собственную процедуру CCL - на странице CCL Wikipedia описано несколько различных алгоритмов, и оба они довольно просты в реализации.

0 голосов
/ 03 марта 2011

Я думаю, что лучший и простой вариант работы с BLOB-объектами с OpenCV - это использовать библиотеку cvBlob.Это универсальная библиотека с OpenCV и ее так легко использовать.

...