2011-01-09 13 views
13

Używam OpenCV do filtrowania obrazu dla pewnych kolorów, więc mam binarny obraz wykrytych regionów.Ekstrakcja kropel w OpenCV

Teraz chcę naruszać te obszary, a następnie pozbyć się mniejsze i znaleźć X, Y współrzędne największego „blob”

szukałem zaleceń, co najlepsze biblioteki byłoby używać? Widziałem cvBlob i cvBlobsLib, ale nie jestem zbyt pewny, jak je skonfigurować. Czy chcę je skompilować razem z projektem, czy też chcę je skompilować i zainstalować w systemie (tak jak w przypadku OpenCV)?

obecnie używam Code :: Blocks IDE na Ubuntu (chociaż to nie powinno ograniczać rzeczy)

Odpowiedz

11

Spóźniam się na imprezę, ale chciałbym po prostu zadzwonić, że istnieje sposób na podłączenie komponentów w opencv, ale nie jest to jeszcze najważniejsze.

Aktualizacja: To jest najważniejsze, po prostu utknęło, czekając na wydanie 3.0 przez wiele lat. Linky to documentation

Zobacz http://code.opencv.org/issues/1236 i http://code.opencv.org/attachments/467/opencv-connectedcomponents.patch

Zastrzeżenie - Jestem autorem.

+2

Dobra robota Jason. Zintegrowaliśmy twój patch i wygląda na to, że działa dobrze. Szybkość też jest dobra. Może dodanie funkcji właściwości byłoby również świetne (np. Obszar, centroïd itp.). W każdym razie, dzięki za wspaniałą pracę. Mam nadzieję, że zespół OpenCV wkrótce włączy łatkę. Jest to poważny brak OpenHV IMHO, zwłaszcza, że ​​druga biblioteka jest przestarzała i używa tylko IplImage * ... –

+0

+1. Dobra robota. Jak zintegrować łatę z OpenCV? – Alexey

+0

Czy to teraz jest w api? jeśli tak, link do dokumentów pomoże przyszłym czytelnikom. – dashesy

10

Niestety OpenCV nie ma podłączonego funkcjonalność znakowania komponent, który wydaje się być poważnym zaniechaniem dotyczący biblioteka wizji komputerowej. W każdym razie ostatnio miałem podobny wymóg, więc zaimplementowałem własną procedurę CCL - jest kilka różnych algorytmów opisanych na CCL Wikipedia page i oba są dość łatwe do wdrożenia.

+1

To wydaje się być najlepszą opcją, dziękuję :) Wydaje się, że na OpenCV jest ogromne przeoczenie, masz rację. – amr

+0

Na stronie OpenCV znajduje się trzecia strona biblioteki BLOBa (cvBlobsLib lub podobna), ale ja na nią patrzyłem, a jakość kodu nie była świetna. Lepiej, żeby w tym przypadku wypróbować własne. –

+0

Jak wspomniano w innej odpowiedzi, nie stwierdza, żeContours dają ekwiwalent etykietowania podłączonych komponentów? – carnieri

11

Możesz użyć findContours, aby to zrobić, zobacz opencv manual i Tutorial to find connected components.


Edit: Kod z samouczka (przez 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

To wygląda obiecująco, po prostu patrząc na jak znaleźć największy kontur/blob - dzięki :) – amr

+0

Myślę, że możesz obliczyć obszar konturu. Jest w tym pewna funkcja. –

+0

Tak, właśnie obliczyłem obszar obwiedni konturu i wykonałem zadanie – amr

0

Myślę, że najlepszym rozwiązaniem i łatwe do pracy z bąble z OpenCV jest użycie biblioteki cvBlob. Jest to kompilująca biblioteka z OpenCV i tak łatwa w użyciu.