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