2010-03-04 88 views
7

我所做的辛勤工作,把我的iSight攝像頭在我的MacBook到紅外攝像機,把它轉換,設置閾值等,現在有一個看起來像這樣的圖像:OpenCV的分組白色像素

alt text

我的問題是現在;我需要通過對白色像素進行分組來了解我的圖像上有多少個斑點。我不想使用cvBlob/cvBlobsLib,我寧願使用OpenCV中已有的東西。

可以循環通過像素,並通過檢查(閾值)觸摸白色像素將它們分組,但我猜測可能是從OpenCV這麼做的一個非常簡單的方法?

我猜我不能使用cvFindContours,因爲這將檢索一個大陣列中的所有白色像素,而不是將它們分隔成「組」。誰能推薦? (注意這些不是圓圈,只是從小紅外發光二極管發出的光線)

很多預先感謝!
tommed

回答

8

在圖像中循環尋找白色像素。當你遇到一個你使用cvFloodFill與該像素作爲種子。然後增加每個區域的填充值,以便每個區域具有不同的顏色。這被稱爲標籤。

+1

+1和@tommed:無論如何,這就是cvBlob的cvlabel.cpp,爲什麼要重新實現它? – AVB 2010-03-04 15:21:19

+0

這完美的作品!非常感謝!! – tommed 2010-03-05 10:20:39

+0

@AB:我不想使用cvBlob的原因是因爲我認爲它仍然是一個單獨的庫(它顯然最近與v 2.0合併),並且我想限制我的程序所需的prereq的數量。 – tommed 2010-03-08 10:27:12

4

是的,你可以用cvFindContours()做到這一點。它將指針返回到找到的第一個序列。使用該指針可以遍歷所有找到的序列。

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

除了這個方法,我建議你看一看cvBlobscvBlobsLib。後者一個作爲官方的blob檢測庫集成在OpenCV 2.0中。

+0

啊,我明白了,那就是我做錯了!非常感謝。 – tommed 2010-03-05 10:21:08

相關問題