как выполнить стабильное определение угла глаза? - PullRequest
17 голосов
/ 10 марта 2012

Для тех, кому это кажется слишком длинным, просто прочитайте жирные строки.

Мой проект по движению курсора на экране, основанный на оценке взгляда, теперь зависит от одной последней вещи - оценки взгляда,для которого я использую углы глаза в качестве контрольной устойчивой точки, относительно которой я буду определять движение зрачка и вычислять взгляд.

Но я не смог стабильно обнаружить углы глазаиз прямой трансляции веб-камеры.Я использовал функции cv.CornerHarris () и GFTT - cv.GoodFeaturesToTrack () для обнаружения углов. Я попробовал демонстрацию FAST (исполняемый файл с их сайта) прямо на изображениях глаз, но это было нехорошо.

Вот некоторые результаты моих пока что обнаруженных углов для изображений.

Использование GFTT:

good lighting, using GFTT

Использование Харриса:

using cv.CornerHarris

что происходит в видео:

corners in video using GFTT Зеленые кружки - это углы, остальные (в розовых, меньших кругах) - другие углы

Я использовал определенную эвристику - что углы будут в левом или правом краях и вокругсредний, если думать вертикально.Я сделал это, потому что после того, как я сделал много снимков в разных условиях, за исключением менее 5% изображений, остальные были такими же, и для них справедлива описанная выше эвристика.

Но этот угол глазаОбнаружения для снимков - не из веб-канала.

Когда я использую методологии (Харрис и GFTT) для веб-канала, я просто не получаю их.

Мой код для определения угла глаза, используя cv.CornerHarris

Углы глаза, используя GFTT

Теперь параметры, которые я используюв обоих методах - они не показывают результаты для разных условий освещения и, очевидно,Но в тех же условиях освещения, что и при съемке этих снимков, я все еще не получаю результат для кадров, запрашиваемых у видео с веб-камеры

Эти параметры из GFTT работают хорошодля средних условий освещения

cornerCount = 100
qualityLevel = 0.1
minDistance = 5

, тогда как эти:

    cornerCount = 500
    qualityLevel = 0.005
    minDistance = 30

хорошо работали для статического изображения, отображаемого выше

minDistance =30 потому что очевидно, что углы будут иметь как минимум такое большое расстояние, опять же, что-то вроде тенденции, которую я видел по моим снимкам.Но я снизил его для версии GFTT для веб-камеры, потому что тогда у меня вообще не было никаких углов.

Кроме того, для версии GFTT в режиме прямой трансляции мне пришлось внести небольшое изменение:

cv.CreateImage((colorImage.width, colorImage.height), 8,1)

тогда как для версии с неподвижным изображением (код на вставке) я использовал:

cv.CreateImage(cv.GetSize(grayImage), cv.IPL_DEPTH_32F, 1)

Обратите внимание на глубину.

Изменит ли это какое-либо качество обнаружения??

Глазное изображение, которое я передавал методом GFTT, не имело глубину 32F, поэтому мне пришлось изменить его и в соответствии с остальными временными изображениями (eignenimg, tempimg и т. Д.)

Итог: я должен закончить оценку взгляда, но без стабильного определения угла глаза я не смогу прогрессировать ... и я должен приступить к обнаружению моргания и отслеживанию зрачка на основе сопоставления с шаблоном (или вы знаете лучше?).Проще говоря, я хочу знать, делаю ли я какие-либо ошибки новичка или не делаю вещи, которые мешают мне получить почти идеальное обнаружение угла глаза в моем видеопотоке с веб-камеры, которое я получил в своих снимках, которые я разместил здесь.

В любом случае, спасибо за то, что дали нам представление. Любая идея, как я могу выполнить определение угла глаза для различных условий освещения, была бы очень полезной

Хорошо, , если вы не поняли, что я делаю в моем коде (какя получаю левый и правый углы), я объясню:

max_dist = 0
maxL = 20
maxR = 0

lc =0
rc =0

maxLP =(0,0)
maxRP =(0,0)

for point in cornerMem:
    center = int(point[0]), int(point[1])

    x = point[0]
    y = point[1]


    if ( x<colorImage.width/5 or x>((colorImage.width/4)*3) ) and (y>40 and y<70):
                      #cv.Circle(image,(x,y),2,cv.RGB(155, 0, 25))

                      if maxL > x:
                               maxL = x
                               maxLP = center


                      if maxR < x:
                               maxR = x
                               maxRP = center

                      dist = maxR-maxL

                      if max_dist<dist:
                           max_dist = maxR-maxL
                           lc = maxLP
                           rc = maxRP





    cv.Circle(colorImage, (center), 1, (200,100,255)) #for every corner

cv.Circle(colorImage,maxLP,3,cv.RGB(0, 255, 0)) # for left eye corner
cv.Circle(colorImage,maxRP,3,cv.RGB(0,255,0))   # for right eye corner

maxLP и maxRP сохранит (x, y) для левого и правого углов глазасоответственно.Что я здесь делаю, так это взятие переменной для определения левого и правого углов, maxL и maxR соответственно, которые будут сравниватьсях-значения углов обнаружены.Теперь просто, для maxL, это должно быть что-то больше 0;Я назначил ему 20, потому что если левый угол находится в точке (x, y), где x <20, то maxL будет = x, или, скажем, т.е. X-ордината левого угла будет найдена таким образом.Точно так же для самого правого угла. </strong>

Я тоже пытался для maxL = 50 (но это означало бы, что левый угол почти в середине области глаза), чтобы получить больше кандидатов на подачу веб-камерычто я вообще не получаю никаких углов

Кроме того, max_dist хранит максимальное расстояние между до сих пор видимыми X-ординатами и, таким образом, дает меру того, какая пара углов будет слева и справауголки глаза - тот, у которого максимальное расстояние = max_dist

Кроме того, из моих снимков я видел, что Y-ординаты углов глаза попадают в промежутки между 40-70, поэтому я использовал это, чтобы свестипул кандидатов

Ответы [ 3 ]

6 голосов
/ 15 марта 2012

Я думаю, что есть простой способ помочь!

Похоже, вы рассматриваете каждый глаз изолированно. Я предлагаю вам объединить данные для обоих глаз, а также использовать геометрию лица. Я проиллюстрирую свои предложения картиной, которую некоторые люди могут распознать (это не самый лучший пример, так как это картина, а ее лицо немного смещено от центра, но это, безусловно, самое смешное ..)

enter image description here

Кажется, у вас есть надежные оценки положения зрачка для обоих глаз, и, если лицо смотрит прямо на камеру (при этом методе повороты лица перпендикулярно экрану будут в порядке), мы знаем, что углы глаза (отныне просто «углы») будут лежать на (или вблизи) линии, проходящей через зрачки обоих глаз (красная пунктирная линия).

Мы знаем расстояние между зрачками, a, и мы знаем, что соотношение между этим расстоянием и расстоянием между глазами (* угол на угол) b фиксировано для человека и не будет сильно меняются среди взрослого населения (может отличаться в зависимости от пола).

ie. a / b = constant.

Поэтому мы можем вывести b независимо от расстояния до объекта, зная только a.

Используя эту информацию, мы можем построить пороговые блоки для каждого угла глаза (подробно пунктирные прямоугольники, помеченные 1, 2, 3, 4). Каждая ячейка имеет размер b на c (высота глаза, снова определяемая по тому же принципу фиксированного отношения) и лежит параллельно оси зрачка. Центральный край каждой коробки прикреплен к центру зрачка и движется вместе с ним. Мы знаем, что каждый угол всегда будет в своем собственном пороговом окне!

Теперь, конечно, проблема в том, что зрачки двигаются, как и наши пороговые блоки ... но мы таким образом значительно сузили поле, потому что мы можем уверенно отбрасывать ВСЕ оценочные положения глаз (из Harris или GFTT или что-нибудь еще) выпадая из этих коробок (при условии, что мы уверены в том, что наш зрачок обнаружен).

  • Если у нас есть высокая достоверность только в одной угловой позиции, мы можем экстраполировать и вывести все остальные угловые позиции только из геометрии! (для обоих глаз!).

  • Если есть сомнения между несколькими угловыми позициями, мы можем использовать знания о других углах (из любого глаза), чтобы разрешить их вероятностным связыванием их позиций, делая правильное предположение. то есть. любая пара оценок (в пределах их рамок, конечно) лежит на расстоянии b и параллельно оси зрачка.

  • Если вы можете получить общие «глазные» позиции, которые не двигаются при движении зрачка (или фактически любые черты лица в одной плоскости), это чрезвычайно полезно и позволяет вам определять геометрические положения углов.

Надеюсь, это поможет вам найти неуловимое d (смещение зрачка от центра глаза).

5 голосов
/ 08 апреля 2012

я изменил это

if ( x<colorImage.width/5 or x>((colorImage.width/4)*3) ) and (y>40 and y<70):

к этому:

if ( x<(w/5) or x>((w/4)*3) ) and (y>int(h*0.45) and y<int(h*0.65)):

потому что раньше я просто вручную просматривал значения пикселей, за пределами которых мои окна, где углы можно было найти с наибольшей вероятностью. Но потом я понял, что давайте сделаем его общим, поэтому я сделал горизонтальное окно от 45 до 65 пк диапазона Y и от 1/5 до 3/4 для диапазона X, потому что это обычная область, в которой находятся углы.

Извините, ребята, что ответили поздно, я был занят более поздней частью проекта - оценкой взгляда. И я собираюсь отправить вопрос об этом, я застрял в этом.

кстати, вот несколько фотографий уголков глаз и зрачка, обнаруженных в моем глазу: (увеличено до 100х100)

enter image description here

enter image description here

enter image description here Надеюсь, что это будет полезно для других, начинающих в этой области.

1 голос
/ 07 июля 2013

Вы пробовали сегментацию склеры?

Возможно, вы сможете сделать и с 2 углами склеры, и это может быть проще, потому что у вас уже работает приличное обнаружение зрачка, склера - более яркая областьокружающий ученика.

...