2014-03-03 2 views
1

Я использую opencv 2.4.2 и C++. У меня есть изображение лица. Слева от картины я хочу с наименьшей сложностью определить координату одного угла глаза. Моя программа будет выглядеть следующим образом:Найти координату угла глаза, используя разницу в цвете

  1. входного изображения лица

  2. изображение Сканирование сверху до тех пор, пока не встретит своего рода разницы между цветом кожи и первый белый пиксель в углу глаза

  3. Нарисуйте вид красной точки в этом углу

  4. не продолжать сканирование изображений

  5. Отображение (х, у) координатой в этой точке

То, что я до сих пор:

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

Смежные вопросы