Скоро будет год, как мы выпустили продукт с Custom’ной калибровкой Eye-tracker’а на борту. К сожалению, по разным причинам, все никак не получалось добить эту статью. Однако, недавно произошел забавный случай, который побудил закончить начатое. Но, обо всем по порядку. Надеюсь, кому-нибудь все-таки пригодится наш опыт, несмотря на то, что пост получился сыроватым.

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

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

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

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


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


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



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

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

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

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

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

  • время на калибровку по одной калибровочной точке – 3 сек;
  • индекс рассматриваемой точки – 5 (если индекс получаемой с устройства точки кратен данному, то учитываем ее при расчетах калибровки);
  • максимально допустимое отклонение от калибровочной точки (px), вычисляется по формуле:

    $Math.Min(regionWidth, regionHeight) * 0.45$

    где $regionWidth$ и $regionHeight$ – ширина и высота ячейки калибровочной матрицы соответственно


Алгоритм калибровки (прост до безумия)


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

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



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



Использование (еще проще)


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

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

К сожалению, из-за договора о неразглашении, я не могу указать ни название ПО, ни выложить исходники или скрины. Благо хоть алгоритмом разрешили поделиться. Надеюсь, что кому-нибудь пост все же будет полезным.

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

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

А вот и то самое событие, которое способствовало «завершению» статьи: по какому-то немыслимому стечению обстоятельств, моему другу (из предыдущего поста) довелось вживую пообщаться с разработчиком из Tobii AB. В ходе разговора, разработчик упомянул о неидеальности стандартной калибровки и что наши усилия были не напрасны.