2011-01-09 101 views
13

我使用OpenCV篩選某些顏色的圖像,所以我得到了一個二進制圖像的檢測區域。在OpenCV中的斑點提取

現在我想蠶食這些領域,然後擺脫規模較小的,並找到X,最大的「斑點」

我一直在尋找的建議,以什麼最好的圖書館將是y座標使用?我見過cvBlob和cvBlobsLib,但我不太清楚如何設置它們。我想將它們與項目一起編譯還是我想編譯它們並將它們安裝到系統中(就像我使用OpenCV一樣)?

我目前使用的代碼::塊IDE在Ubuntu(儘管這不應該限制的東西)

回答

10

不幸的OpenCV沒有任何連通區域標記功能,這似乎是一個嚴重的遺漏計算機視覺庫。無論如何,我最近有一個類似的要求,所以我實現了我自己的CCL例程 - 在CCL Wikipedia page上描述了幾種不同的算法,它們都很容易實現。

+1

這似乎是最好的選擇,謝謝:)它似乎是OpenCV的一部分,你是對的。 – amr 2011-01-09 21:47:04

+0

OpenCV網站上有第三方blob庫(cvBlobsLib或類似的文件),但我看了一下,代碼質量並不好。我認爲,在這種情況下更好地推出自己的產品。 – 2011-01-09 21:50:26

+0

正如在另一個答案中提到的,沒有找到Contours給出的等效連接組件的標籤? – carnieri 2011-01-10 17:49:07

11

您可以使用findContours來做到這一點,請參閱opencv manualTutorial to find connected components


編輯:代碼從教程(通過Archive.org)

#include <stdio.h> 
#include <cv.h> 
#include <highgui.h> 

int main(int argc, char *argv[]) 
{ 
    IplImage *img, *cc_color; /*IplImage is an image in OpenCV*/ 
    CvMemStorage *mem; 
    CvSeq *contours, *ptr; 
    img = cvLoadImage(argv[1], 0); /* loads the image from the command line */ 
    cc_color = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 3); 

    cvThreshold(img, img, 150, 255, CV_THRESH_BINARY); 
    mem = cvCreateMemStorage(0); 
    cvFindContours(img, mem, &contours, sizeof(CvContour), CV_RETR_CCOMP, 
     CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0)); 


    for (ptr = contours; ptr != NULL; ptr = ptr->h_next) { 
     CvScalar color = CV_RGB(rand()&255, rand()&255, rand()&255); 
     cvDrawContours(cc_color, ptr, color, CV_RGB(0,0,0), -1, CV_FILLED, 8, cvPoint(0,0)); 
    } 

    cvSaveImage("result.png", cc_color); 
    cvReleaseImage(&img); 
    cvReleaseImage(&cc_color); 
    return 0; 
} 
0

我認爲最好的和容易的選擇與斑點工作,OpenCV的是使用cvBlob庫。它是OpenCV的一個輔助庫,它非常易於使用。