Как мы custom’ную калибровку для Eye-tracker’а пилили


Если кратко, Eye-tracker – это устройство, позволяющие отслеживать направление взгляда, а также положение глаз и головы.

У Eye-tracker’ов довольно много сфер применения, одной из таких – является индустрия компьютерных игр (немного подробнее).

Зачастую, детекция взгляда отвечает за вспомогательные, но немаловажные действия в играх:

  • перемещение камеры;
  • прицеливание;
  • выделение объектов для взаимодействия;
  • выбор оружия;
  • автоматический вызов паузы при потере взгляда;
  • прочие.



В большинстве случаев, стандартной калибровки (речь пойдет об устройстве Tobii Eye Tracker 4C) хватает для комфортного использования Eye Track’ера.



Но, к сожалению, для наших целей, точности устройства, достигающейся стандартной калибровкой недостаточно, поскольку, в нашем проекте управление взглядом является основной игровой механикой.

Из всего вышесказанного, сформировалась задача: улучшить стандартную калибровку;
условия: устройство Tobii Eye Tracker 4C, язык разработки – C# (WPF).

Вроде бы решение на поверхности: хочешь большей точности – добавь больше калибровочных точек, но не так все просто.

Tobii Technology имеет довольно много инструментов для работы со своими девайсами. Радости не было предела, когда был обнаружен Tobii Pro SDK, в котором есть все плюшки для работы с калибровкой, но как выяснялось позже, данный SDK не пригоден для работы конкретно с моделью eye tracker’а, которая имеется у нас (хотя странно, что детекция взгляда устройством при использовании данного SDK все же присутствовала). Пришлось взять инструмент попроще – Tobii.EyeX.Client.

Эмпирическим путем было выявлено оптимальное количество точек калибровки и их расположение: матрица 4x3 с расположенными 12ю калибровочными точками (каждая в центре ячейки).

Также эмпирическим путем были найдены следующие параметры:

  • время на калибровку по одной калибровочной точке – 3 сек;
  • индекс рассматриваемой точки – 5 (если индекс текущей точки, получаемой с устройства, кратен данному, то происходит обработка);
  • максимально допустимое отклонение от калибровочной точки (px), вычисляется по формуле:
    $$display$$Math.Min(regionWidth, regionHeight) * 0.45$$display$$ где regionWidth и regionHeight – ширина и высота ячейки калибровочной матрицы соответственно

Алгоритм калибровки

(прост до безумия)

Калибровка производится последовательно, по каждой ячейке калибровочной матрицы:

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



По завершению калибровки имеем коллекцию из 12ти усредненных значений смещений по регионам (ячейкам матрицы).



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

(еще проще)

  1. определяем, в какой регион попадает точка, получаемая с устройства;
  2. смещаем точку, получаемую с устройства, на усредненное значение смещения в данном регионе.

Таким образом, удалось программным способом повысить точность устройства Tobii Eye Tracker 4C (сделав надстройку над стандартной калибровкой).

В статье приведено максимально простое описание основного процесса калибровки. Помимо этого, происходит куча еще чего:

  • усреднение значения точки с предыдущим (для плавности);
  • проверка выхода за границы экрана;
  • отслеживание потери взгляда;
  • отслеживание изменения положения глаз в пространстве;
  • отслеживание статуса Eye Tracker’а;
  • отслеживание изменения разрешения экрана;
  • отслеживание отмены калибровки;
  • рандомный выбор типа калибровочных меток;
  • и многое другое.
Теги:
eye-tracker, c#, algorithms

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