Для тех, кто находит это слишком длинным, просто прочитайте жирные строки.
Мой проект оценки взгляда, основанный на перемещении экранного курсора HCI, теперь зависит от последней вещи — оценки взгляда, для которой я использую углы глаз в качестве эталонной стабильной точки, относительно которой я буду обнаруживать движение зрачка и вычислять взгляд.
Но мне не удалось стабильно определить уголки глаз в прямом эфире с веб-камеры. Я использовал функции cv.CornerHarris() и GFTT - cv.GoodFeaturesToTrack() для обнаружения углов. Я попробовал демо-версию FAST (исполняемый файл с их веб-сайта) непосредственно на изображениях моих глаз, но это не помогло.
Вот некоторые результаты моего обнаружения угловдля изображений.
Использование GFTT:
Использование Harris:
что происходит на видео:
Зеленые круги — это углы, другие (розовые, меньшие кружки) — другие углы
Я использовал определенный эвристический - что углы будут в левом или правом крае и вокруг середины, если мыслить вертикально. Я сделал это, потому что после того, как я сделал много снимков во многих условиях, за исключением менее 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, поэтому я использовал это также, чтобы минимизировать пул кандидатов