Domanda

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:

alt text

Il mio problema è ora; Ho bisogno di sapere quanti macchie sono sulla mia immagine raggruppando i pixel bianchi. Non voglio usare cvBlob / cvBlobsLib, preferirei basta usare ciò che è già in OpenCV.

I possono un ciclo tra i pixel e le loro gruppo di controllo per (thresholded) pixel bianchi toccanti, ma sto cercando di indovinare v'è probabilmente un modo molto semplice di fare questo da OpenCV?

sto cercando di indovinare che non posso usare cvFindContours quanto ciò recuperare tutti i pixel bianchi in un unico grande array, piuttosto che li separa in "gruppi". Qualcuno potrebbe consigliare? (Nota queste non sono cerchi, solo la luce emessa da piccoli LED IR)

Molte grazie in anticipo!
tommed

È stato utile?

Soluzione

Loop attraverso l'immagine alla ricerca di pixel bianchi. Quando si verifica uno di utilizzare cvFloodFill con quel pixel come seme. Quindi incrementare il valore di riempimento per ogni regione, in modo che ogni regione ha un colore differente. Questo è chiamato l'etichettatura.

Altri suggerimenti

Sì, è possibile farlo con cvFindContours(). Restituisce il puntatore alla prima sequenza che è stato trovato. Utilizzando tale puntatore si può attraversare attraverso tutte le sequenze trovato.

    // 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. uno degli ultimi è integrato in OpenCV 2.0 come lib ufficiale riconoscimento di regioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top