Для тех, кто считает это слишком длинным, просто прочитайте жирные строки.
Мой проект курсора экрана, основанного на оценке взгляда, перемещающего HCI, теперь зависит от одной последней оценки - взгляда, для которой я использую углы глаз как опорную стабильную точку, относительно которой я буду обнаруживать движение зрачка и вычислять взгляд.
Но я не смог стабильно обнаруживать углы глаз из живой веб-камеры. Я использовал функции cv.CornerHarris() и GFTT - cv.GoodFeaturesToTrack() для определения угла. Я попробовал демонстрацию FAST (исполняемый файл с их сайта) прямо на моих изображениях глаз, но это было плохо.
Это некоторые результаты моих ранних обнаружений угла для изображений.
Использование GFTT:
Использование Харриса:
что происходит в видео:
Зеленые циркуль - это углы, другие (в розовых, более мелких кругах) - это другие углы
Я использовал определенную эвристику - чтобы углы были в левой или правой крайности и вокруг середины, если они думали вертикально. Я сделал это, потому что после многих снимков во многих условиях, за исключением менее 5% изображений, остальное похоже на них, и для них выполняется эвристика выше.
Но эти обнаружения угла глаз предназначены для моментальных снимков, а не из веб-камеры.
Когда я использую методологии (harris и GFTT) для подачи веб-камеры, я просто не получаю их.
Мой код для обнаружения угла глаз с использованием cv.CornerHarris
Угол глаз с использованием GFTT
Теперь параметры, которые я использую в обоих методах - они не показывают результаты для разных условий освещения и, очевидно. Но в том же состоянии освещения, что и в тех, в которых были сделаны эти снимки, я все еще не получаю результат для кадров, которые я запросил из видео с веб-камеры
Эти параметры из GFTT работают хорошо для средних условий освещения
cornerCount = 100
qualityLevel = 0.1
minDistance = 5
тогда как они:
cornerCount = 500
qualityLevel = 0.005
minDistance = 30
работал хорошо для статического изображения, отображаемого выше
minDistance = 30, потому что, очевидно, углы имели бы по крайней мере такое большое расстояние, опять-таки, что-то вроде тенденции, которую я видел из своих снимков. Но я опустил его для версии подачи веб-камеры GFTT, потому что тогда у меня не было никаких углов вообще.
Кроме того, для версии GTPT в режиме реального времени есть небольшое изменение, которое я должен был разместить:
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/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 соответственно, которые будут сравниваться к значениям x обнаруженных углов. Теперь просто, для maxL, оно должно быть чем-то большим, чем 0; Я назначил его 20, потому что если левый угол находится в точке (x, y), где x < 20, тогда maxL будет = x, или, если скажем, то есть, левая угловая ордината будет найдена таким образом. Аналогично для самого правого угла.
Я тоже пробовал для maxL = 50 (но это означало бы, что левый угол почти посередине области глаз), чтобы получить больше кандидатов для подачи веб-камеры - в которых я вообще не получаю никаких углов
Кроме того, max_dist сохраняет максимальное расстояние между до сих пор видимыми ординатами X и, таким образом, дает меру той пары углов будут левые и правые углы глаз - один с максимальным расстоянием = max_dist
Кроме того, я видел из своих снимков, что ординаты Y-уголков глаз находятся между 40-70, поэтому я тоже использовал это, чтобы свести к минимуму пул кандидатов