2010-03-04 8 views
7

Ho fatto il duro lavoro, trasformando la mia webcam iSight sul mio MacBook in una telecamera a infrarossi, convertito, impostare la soglia ecc .. e ora hanno un'immagine che sembra qualcosa di simile:OpenCV raggruppando i pixel bianchi

alt text

Il mio problema è ora; Devo sapere quanti blob sono presenti sulla mia immagine raggruppando i pixel bianchi. Non voglio usare cvBlob/cvBlobsLib, preferisco semplicemente usare quello che è già in OpenCV.

I can può attraversare i pixel e raggrupparli controllando i pixel bianchi (con soglia) che toccano, ma suppongo che probabilmente ci sia un modo molto semplice per farlo con OpenCV?

Suppongo di non poter utilizzare cvFindContours in quanto recupererà tutti i pixel bianchi in un unico grande array, anziché separarli in "gruppi". Qualcuno potrebbe consigliare? (Nota questi non sono cerchi, solo la luce emessa da piccoli LED IR)

Molte grazie in anticipo!
tommed

risposta

8

Passare attraverso l'immagine alla ricerca di pixel bianchi. Quando ne incontri uno usi cvFloodFill con quel pixel come seme. Quindi incrementare il valore di riempimento per ogni regione in modo che ogni regione abbia un colore diverso. Questo è chiamato etichettatura.

+1

+1 e @tommed: questo è ciò che sta succedendo cvBlob's cvlabel.cpp in ogni caso, quindi perché reimplementarlo? – AVB

+0

Funziona perfettamente! Grazie molto!! – tommed

+0

@AB: la ragione per cui non volevo usare cvBlob era perché pensavo che fosse ancora una libreria separata (apparentemente era unita alla v 2.0), e volevo limitare la quantità di prereq richiesti per il mio programma. – tommed

4

Sì, lo puoi fare con cvFindContours(). Restituisce il puntatore alla prima sequenza trovata. Usando quel puntatore puoi attraversare tutte le sequenze trovate.

// 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 
     ); 
    } 

Oltre a questo metodo, io vi consiglio di dare un'occhiata a cvBlobs o cvBlobsLib. Latter one è integrato in OpenCV 2.0 come lib di rilevamento blob ufficiale.

+0

Ah capisco, questo è quello che stavo facendo male! Molte grazie per questo. – tommed