как выполнить стабильное определение угла глаза?

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

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

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

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

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

good lighting, using GFTT

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

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)

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

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/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

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

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

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

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

17
задан bad_keypoints 11 March 2012 в 18:00
поделиться