OpenCV группировка белых пикселей
Я проделал тяжелую работу, превратив свою камеру iSight на MacBook в инфракрасную камеру, преобразовал ее, установил порог и т. д.. а теперь есть изображение, которое выглядит примерно так:
Теперь моя проблема: мне нужно знать, сколько пятен на моем изображении, группируя белые пиксели. Я не хочу использовать cvBlob
/cvBlobsLib
, я бы предпочел просто использовать то, что уже есть в OpenCV.
Я могу перебирать пиксели и группировать их, проверяя на наличие (порог) касаясь белых пикселей, но я предполагаю, что есть, вероятно, действительно простой способ сделать это из OpenCV?
Я предполагаю, что я не могу использовать cvFindContours
, так как это будет извлекать все белые пиксели в одном большом массиве, а не разделять их на "группы". Может кто-нибудь посоветовать? (Обратите внимание, что это не круги, а просто свет, излучаемый маленькими ИК-светодиодами)
Заранее большое спасибо!
томмед
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-объектов.