5 分钟跑通 eyetracker 开源眼动追踪

5 分钟跑通 eyetracker 开源眼动追踪

【免费下载链接】eyetracker Take images of an eye+reflections and find on-screen gaze points. 【免费下载链接】eyetracker 项目地址: https://gitcode.com/gh_mirrors/ey/eyetracker

当你需要让一位无法移动手臂的用户只用眼睛完成网页浏览时,缺的往往不是鼠标替代方案,而是一个能把"注视位置"算出来的人机接口。eyetracker 就是干这件事的开源项目:它从摄像头拍摄的"眼睛 + 屏幕反光"图像里,实时计算你在屏幕上正盯着哪个点,并把这个点输出成可控制的光标。项目基于 openFrameworks 和 OpenCV,核心代码只有两个 C++ 文件,方便你读完整个视线追踪链路后,替换成自己的应用逻辑。

五分钟跑通

先说清环境:项目约 2012 年开发,依赖 OpenCV 2.x(约 2.3)和 openFrameworks 0.7,代码直接调用 OpenCV 2 时代的 cv.h 接口。系统要求 macOS 10.14+(Xcode 工程)或 Ubuntu 18.04+(用 openFrameworks 源码构建),硬件要求 720p 以上摄像头,代码按 640×480、60fps 采集设计。

  1. 克隆仓库:git clone https://gitcode.com/gh_mirrors/ey/eyetracker,并把目录放到 openFrameworks 的 examples/
  2. 确认你的 openFrameworks 已启用 ofxOpenCv 插件,OpenCV 版本为 2.x;在 Project.xcconfig 中把 OF_PATH 指向你本机的 openFrameworks 根目录
  3. 用 Xcode 打开 eyetracker.xcodeproj,选择 Debug 编译运行
  4. 首次运行时摄像头以 640×480 启动,窗口里先出现眼睛图像和瞳孔椭圆等调试层;按 m 开启视线光标,屏幕上会出现由视线驱动的光标点

如果你机器上只有 OpenCV 4,cvCreateMatCvSeq 这类接口在 4.x 已移除,需要按 2.x 版本重新编译 OpenCV 再链接,否则无法编译通过。

瞳孔检测与注视点计算是怎么算出来的

算法走的是瞳孔-角膜反射法(pupil-Perkins,Perkins 点指屏幕光在角膜上的镜面反光斑)。流程像"先找瞳孔中心,再看反光点偏了多远,两者一比就知道你往哪看":

  1. 在每帧图像里用直方图找灰度峰谷(calcHistPeak)自动算二值化阈值,把暗区提取出来;
  2. 对暗区做椭圆拟合得到瞳孔质心(findPupil);
  3. 在瞳孔周围固定半径内寻找最亮的反光点(findPerkinje),并做排序平均以抗抖动;
  4. 瞳孔中心与反光点的相对向量代表眼球转动量,先用相机-LED 透视映射(calcPerspectiveMap)把反光点换算成"屏幕上的 LED 位置",再乘上校准阶段算出的透视矩阵,落成最终屏幕坐标。

为了应对头部移动,屏幕被切成了 3×3 的校准网格,每个格子对应一块独立的透视变换矩阵(calibration_datum 中的 mat 数组),而不是用一张全屏幕映射,这样局部误差不会扩散到整个画面。

关键文件速览

  • src/cvEyeTracker.h:主类 cvEyeTracker 的声明,以及校准数据(calibration_datum)、查找表(fLUT)等数据结构
  • src/cvEyeTracker.cpp:约 2200 行,实现瞳孔检测、反光点查找、直方图阈值、透视映射与校准矩阵计算
  • src/main.cpp:openFrameworks 入口,仅负责创建窗口并挂上主类
  • Project.xcconfig:Xcode 构建配置,定义 OF_PATH 与 OpenCV 库的搜索路径
  • eyetracker.xcodeproj:macOS 工程文件

九点校准流程与精度调优

校准交互直接由键盘驱动(见 cvEyeTracker.cppkeyPressed):

  1. 启动后屏幕按 3×3 网格高亮,用方向键选中第一个校准点
  2. 注视该点并保持稳定,按回车记录当前平均注视坐标
  3. 移动到下一个校准点,重复步骤 1-2,直到九点全部记录
  4. 每记录一点,程序即重算该区域的透视矩阵(calcCalibrationMap
  5. m 打开视线光标,在屏幕上移动视线验证校准效果

两条实操建议:

  • 摄像头与眼睛保持 50-70 厘米、基本正对,不要斜对屏幕,否则反光点位置会系统性偏移
  • 校准前先用开发层确认瞳孔椭圆稳定(按 ae 切换眼睛图像与椭圆显示),晃动剧烈时不要记录

Q:瞳孔识别不出来或频繁丢失? 多半是环境光太亮或摄像头没对准,先加强屏幕反光(靠近红外补光)再降低 h_manual_threshold

Q:校准后光标在中心区域还是漂? 重新做一次九点校准,重点保证四角和中心五点各自停留时视线不移动。

能拿它做什么

  • 无障碍视线控制:把输出的屏幕坐标喂给辅助功能框架,实现无手操作浏览;关键依赖是校准稳定性和抗抖动滤波
  • 注视轨迹研究:录制 PoR(注视点)序列做界面热力图;依赖你自己在 bToggleRec 相关代码上扩展日志格式
  • 眼控创意装置:接入 openFrameworks 的图形/音频模块做交互作品;难度最低,改 main.cpp 入口即可

局限与后续方向

项目自 2012 年后基本停更,README 也自述"work in progress",接口停留在 OpenCV 2.x,且没有现成的校准存储/加载逻辑,每次运行都要重做校准,头部大幅移动时精度会明显下降。后续演进方向大概率是:把校准结果持久化、用现代 OpenCV(或替换为直接视频流)重编译,以及在注视点输出上加一层平滑滤波。

【免费下载链接】eyetracker Take images of an eye+reflections and find on-screen gaze points. 【免费下载链接】eyetracker 项目地址: https://gitcode.com/gh_mirrors/ey/eyetracker

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值