Как выполнить стабильное обнаружение угла глаз? - программирование
Подтвердить что ты не робот

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

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

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

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

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

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

good lighting, using GFTT

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

using cv.CornerHarris

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

corners in video using 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, поэтому я тоже использовал это, чтобы свести к минимуму пул кандидатов

4b9b3361

Ответ 1

я изменил это

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/5th-3/4ths для диапазона X, потому что это обычная область, в которой расположены углы.

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

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

enter image description here

enter image description here

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

Ответ 2

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

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

enter image description here

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

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

ie. a / b = constant.

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

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

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

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

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

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

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

Ответ 3

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

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