2010-03-04 11 views
7

Ich habe auf die harte Arbeit getan, meine iSight Kamera auf meinem MacBook in eine Infrarot-Kamera drehen, konvertierte es, stellen Sie die Schwelle etc .. und habe jetzt ein Bild, das ungefähr so ​​aussieht:OpenCV Gruppierung weißen Pixel

alt text

Mein Problem ist jetzt; Ich muss wissen, wie viele Blobs auf meinem Bild sind, indem ich die weißen Pixel gruppiere. Ich möchte nicht cvBlob/cvBlobsLib verwenden, ich würde lieber nur verwenden, was bereits in OpenCV ist.

I kann Schleife durch die Pixel und gruppieren sie durch Überprüfung (threshold) berühren weiße Pixel, aber ich vermute, es gibt wahrscheinlich eine wirklich einfache Möglichkeit, dies von OpenCV zu tun?

Ich schätze, ich kann cvFindContours nicht verwenden, da dies alle weißen Pixel in einem großen Array abrufen wird, anstatt sie in "Gruppen" zu trennen. Kann jemand empfehlen? (Beachten Sie, dass dies keine Kreise sind, nur das Licht, das von kleinen IR-LEDs emittiert wird)

Vielen Dank im Voraus!
tommed

Antwort

8

Schleife durch das Bild für weißen Pixel suchen. Wenn Sie auf eines stoßen, verwenden Sie cvFloodFill mit diesem Pixel als Seed. Erhöhen Sie dann den Füllwert für jede Region, sodass jede Region eine andere Farbe aufweist. Dies wird Etikettierung genannt.

+1

+1, und @tommed: das ist, was cvBlob cvlabel.cpp sowieso läuft, also warum es neu implementieren? – AVB

+0

Das funktioniert perfekt! Danke vielmals!! – tommed

+0

@AB: Der Grund, warum ich cvBlob nicht verwenden wollte, war, weil ich dachte, dass es immer noch eine separate Bibliothek war (es wurde vor kurzem mit v 2.0 verschmolzen), und ich wollte die Menge an Voraussetzungen für mein Programm begrenzen. – tommed

4

Ja, Sie können es mit cvFindContours() tun. Es gibt den Zeiger auf die erste gefundene Sequenz zurück. Mit diesem Zeiger können Sie alle gefundenen Sequenzen durchlaufen.

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

Neben dieser Methode, würde ich Ihnen raten, bei cvBlobs oder cvBlobsLib einen Blick zu nehmen. Letzteres ist in OpenCV 2.0 als offizielle Blob-Erkennungsbibliothek integriert.

+0

Ah ich sehe, das ist was ich falsch gemacht habe! Vielen Dank dafür. – tommed