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