2010-03-04 27 views
7

Ben bir kızılötesi kameraya benim MacBook benim iSight kamera dönüm, sıkı çalışma yaptık, bunu dönüştürülen eşiği vb set .. ve şimdi şuna benzer bir görüntü var:OpenCV gruplama beyaz pikseller

alt text

Sorunum şimdi; Beyaz pikselleri gruplayarak görüntüde kaç tane blob olduğunu bilmek istiyorum. cvBlob/cvBlobsLib'u kullanmak istemiyorum, sadece OpenCV'de olanları kullanmak istiyorum.

I pikseller arasında döngü yapabilir ve beyaz piksellere dokunarak (eşikte) işaretleyerek onları gruplandırabilirim, ancak muhtemelen bunu OpenCV'den yapmanın gerçekten kolay bir yolu olduğunu tahmin ediyorum.

cvFindContours'u kullanamayacağımı tahmin ediyorum, bu işlem tüm beyaz pikselleri "gruplar" a ayırmak yerine büyük bir dizide alacaktır. Birisi tavsiye edebilir mi? (Bunlar çevreler değil, sadece küçük IR LED'lerinden yayılan ışıktır)

Çok Teşekkürler!
tommed

cevap

8

Beyaz pikseller arayan görüntüyü çevirin. Karşılaştığınız zaman, o pikseli cvFloodFill kullanıyorsunuz. Daha sonra her bölgenin farklı bir renge sahip olması için her bölge için doldurma değerini artırın. Bu etiketleme denir.

+1

+1, ve @tommed: cvBlob'un cvlabel.cpp 'sinde neyse neler oluyor, niçin onu yeniden canlandırıyorsunuz? – AVB

+0

Bu mükemmel çalışıyor! Çok teşekkürler!! – tommed

+0

@AB: cvBlob kullanmak istemediğim nedeni, bunun hala ayrı bir kütüphane olduğunu düşündüğümden (görünüşe göre yakın zamanda v 2.0 ile birleştirildi) ve programım için gerekli önkoşulların miktarını sınırlamak istedim. – tommed

4

Evet, cvFindContours() ile yapabilirsiniz. İşaretçiyi bulunan ilk diziye döndürür. Bu işaretçiyi kullanarak bulunan tüm dizileri geçebilirsiniz.

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

Bu yöntemde Ayrıca, ben cvBlobs veya cvBlobsLib bakmak için tavsiye ederiz. Sonuncusu, OpenCV 2.0'da resmi blob detection lib olarak entegre edilmiştir.

+0

Ah Anlıyorum, yanlış yaptığım şey buydu! Bunun için çok teşekkürler. – tommed