2011-01-09 3 views
13

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

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

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

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

ответ

11

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

Обновление: Это указано, оно просто застряло в ожидании выхода 3.0 в течение нескольких лет. Linky to documentation

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

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

+2

Хорошая работа Джейсон. Я включил ваш патч и, похоже, хорошо работает. Скорость тоже хороша. Может быть, добавление некоторых свойств будет слишком велико (например, area, centroïd и т. Д.). Во всяком случае, спасибо за отличную работу. Я надеюсь, что команда OpenCV скоро включит ваш патч. Это серьезный недостаток OpenCV IMHO, тем более что другая библиотека устарела и использует только IplImage * ... –

+0

+1. Хорошая работа. Как интегрировать патч в OpenCV? – Alexey

+0

Это сейчас в api? если да, ссылка на документы поможет будущим читателям. – dashesy

10

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

+1

Это, кажется, лучший вариант, спасибо :) Это похоже на массивный контроль над частью OpenCV, вы правы. – amr

+0

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

+0

Как уже упоминалось в другом ответе, не находитКонкурсы дают эквивалент маркировки подключенных компонентов? – carnieri

11

Для этого вы можете использовать findContours, см. opencv manual и Tutorial to find connected components.


Edit: код из учебника (через 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; 
} 
+0

Это выглядит многообещающим тоже, просто глядя, как найти самый большой контур/blob - спасибо :) – amr

+0

Я думаю, вы можете рассчитать площадь контура. Для этого есть какая-то функция. –

+0

Да, я только что подсчитал область ограничивающего прямоугольника контура, и он выполнил задание – amr

0

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

Смежные вопросы