2014-03-03 40 views
1

我使用的是opencv 2.4.2和C++。我有一個臉部圖像。從圖片左側開始,我想以最小的複雜度來確定眼角的座標。我的計劃將是如下:使用顏色差異查找眼角的座標

  1. 面部圖像輸入

  2. 從頂部

    掃描圖像,直到它遇到了一種膚色和第一白色像素之間的差異在眼角處

  3. 在這個角落繪製樣紅點

  4. 不繼續掃描圖像

  5. 顯示(X,Y),在這一點上

我有什麼座標直到如今

int main() { 
    Mat img = imread("MVC-003F.jpg"); 

    for(int i = 0; i < img.rows; i++) { 
     for(int j = 0; j < img.cols; j++) { 
      Vec3b color = img.at<Vec3b>(Point(i,j)); 
      if(color.val[0] == 255 && color.val[1] == 255 && color.val[2] == 255) 
       cout << (Point(i,j)) << endl; 
     } 

    } 

    imshow("out", img); 
    waitKey(0); 
    return 0; 
} 

很顯然,這並沒有解決我的問題,而是返回一個錯誤。掃描完圖像後,我無法確定是否需要對cvtColor進行HSV和閾值,或者繼續使用RGB。

這裏是我想要達到的圖片(紅點,在一隻眼睛的角落):

enter image description here

+1

除非你有一些保證圖像將是某種類型/質量,有許多病理性和非病理性反例到任何種類的用於檢測眼睛位置的簡單顏色匹配算法。 – ldog

+0

臉部圖片將會像上面的人或者亞洲人的人物一樣 – Steph

回答

1

我很欣賞你的目標在簡單性。由於鏡面反射或曝光過度,白色物體的顏色並不總是會導致白色像素,而非白色可能會變成白色像素。順便說一下,你的眼角具有灰度209而不是255,並且非常接近該強度(在值200處),還有一些其他像素,如下圖所示。這意味着依靠像素強度可能不會太過分。

enter image description here

你「在眼睛的餘光樣的膚色和第一白色像素之間的差異」提到,但你沒有衡量的區別 - 剛剛籤的一個值。實際上,您可以根據需要檢查許多差異,如下面的過濾器所示。比較差異可能是一種很好的方法,您可以改進但查看特定位置的差異。

只需使用matchTemplate()將圖像與一些圖案過濾器進行卷積即可找到用於進一步分析的好區域。例如,將灰色模糊圖像與下面的濾鏡進行卷積(包含3個橫條紋:白色,黑色,白色)之後,我得到了此結果,您可以輕鬆找到眼睛的垂直位置,甚至是嘴巴的位置。爲了獲得更多的過濾器配置,看看本文早期Ada boost paper for face detection.

enter image description here enter image description here enter image description here