2010-06-17 77 views
5

我試圖檢測視頻中的白色物體。第一步是過濾圖像,使其僅保留白色像素。我的第一種方法是使用HSV色彩空間,然後檢查高級別的VAL通道。以下是代碼:什麼是檢測白色的最佳方法?

//convert image to hsv 
cvCvtColor(src, hsv, CV_BGR2HSV); 
cvCvtPixToPlane(hsv, h_plane, s_plane, v_plane, 0); 

for(int x=0;x<srcSize.width;x++){ 
    for(int y=0;y<srcSize.height;y++){ 
    uchar * hue=&((uchar*) (h_plane->imageData+h_plane->widthStep*y))[x]; 
    uchar * sat=&((uchar*) (s_plane->imageData+s_plane->widthStep*y))[x]; 
    uchar * val=&((uchar*) (v_plane->imageData+v_plane->widthStep*y))[x]; 

    if((*val>170)) 
     *hue=255; 
    else 
     *hue=0; 
    } 
} 

將結果留在色相通道中。不幸的是,這種方法對照明非常敏感。我確信有更好的方法。有什麼建議麼?

回答

2

它對照明很敏感 - 如果你在紅燈下看它會發生什麼!
我不知道使用YUV空間是否比尋找類似的RGB值容易得多。

編輯 - 通常你會打電話給沒有灰色的東西(可以幫助你搜索)。
如果您有選擇,這是要搜索的最差顏色,因爲它會反映場景中的其他任何照明。所以你必須檢測整體照明顏色並進行調整。

因此,您要尋找的是具有相似RGB值的像素,或者是場景中物體平均比例的RGB值。

+0

我的意思是白色=灰色=沒有顏色,實際上我試圖檢測白色塑料眼鏡。這裏是一個示例圖片: http://tinypic.com/r/14t1p1x/6 – dnul 2010-06-17 21:11:37

+0

我不確定,你是說如果我在頂部放一盞紅燈,那麼眼鏡的顏色會變成某種偏紅色而不是尋找白色像素,我應該尋找類似的像素,無論顏色? – dnul 2010-06-17 23:32:52

+3

如果你在場景中有白色物體,並用紅光點亮它們,它們將看起來紅色!在這種情況下,您將不得不查找「白色」對象的顏色並搜索該顏色 – 2010-06-18 00:02:46

2

爲什麼使用HSV?轉換爲HSL並使用亮度通道會更有意義。當然,你不會得到只有白色,但每個顏色高亮度超過閾值。畢竟,除非源圖像曝光過度,否則不能依靠純白色。

2

另一種方法是將您的圖像變成灰度。白色將具有非常高的值(幾乎> 225)。

還有另外一種方法是和R,G和B平面。只有白人會留在最終的圖像。這樣,你就不用花時間計算轉換到HSV色彩空間。你只是在每個像素處進行簡單的AND操作。

相關問題