eyeLike 眼动追踪指南:用普通摄像头 3 步搭好免费的瞳孔追踪系统
【免费下载链接】eyeLikeA webcam based pupil tracking implementation.项目地址: https://gitcode.com/gh_mirrors/ey/eyeLike
商业眼动仪报价动辄上万元,做眼动交互的第一个门槛往往不是算法而是预算。eyeLike 眼动追踪方案提供了另一条路径:一只普通 USB 摄像头、一套 OpenCV 代码,就能实时算出双眼瞳孔中心。它是一个 MIT 许可的开源项目,底层采用 Fabian Timm 的图像梯度瞳孔定位算法,代码量小、结构清晰,适合想零成本入门眼动交互的开发者先跑通、再改造。
eyeLike 项目定位:零硬件成本的 OpenCV 瞳孔追踪参考实现
eyeLike 不依赖红外相机或专用传感器,只用可见光摄像头画面做瞳孔中心定位:算法源自 Fabian Timm 提出的图像梯度瞳孔中心定位方法(Timm & Barth,VISAPP 2011),仓库则提供该算法的开发者参考实现,并附带实时调试窗口,每一步的处理结果都能直接看到。
三个特点决定了它适合入门:
- 硬件零投入:现有 USB 摄像头即插即用,支持大多数市售摄像头,无需购买专业眼动设备。
- 上手成本低:CMake 一条命令链完成编译,src/ 目录里入口、算法、工具文件分工明确,可以逐文件读懂。
- 完全开源:MIT 许可,可自由改参数、扩功能,也能作为教学与二次开发的基线。
原理速览:eyeLike 从摄像头画面到瞳孔中心的四个步骤
程序对每一帧画面依次做四件事:
- 面部检测:加载 res/ 目录下的 Haar 级联分类器,在灰度图中找出最大的人脸框,复杂背景下也能快速锁定位置。
- 眼睛区域提取:人脸出现后不再做第二次级联检测,而是按几何比例直接切出左右眼区域——顶部偏移 25%、侧边 13%、区域高度 30%、宽度 35%(均相对人脸框尺寸)。
- 瞳孔中心定位:核心一步。按 Fabian Timm 算法先求眼睛区域的图像梯度,丢弃低于阈值的弱梯度,再用带权重的梯度向量交汇准则对每个候选中心累加投票,得分最高处即瞳孔中心,最后换算回原始坐标。
- 结果可视化:原始画面、面部特写、左右眼特写四个窗口同时打开,实时画出人脸框、眼睛框与瞳孔中心圆点,便于逐帧判断质量。
部署 eyeLike:环境安装、编译与首次运行
准备编译环境(以 Ubuntu/Debian 为例)
| 组件 | 版本要求 | 安装命令 |
|---|---|---|
| C++ 编译器 | GCC 7.0+ | sudo apt install build-essential |
| CMake | 3.10+ | sudo apt install cmake |
| OpenCV | 3.4+ | sudo apt install libopencv-dev |
建议优先使用 OpenCV 3.4.x 系列;src/main.cpp 中已包含对 4.x 的兼容处理,升级后一般也能正常编译。
克隆仓库并编译 eyeLike
git clone https://gitcode.com/gh_mirrors/ey/eyeLike cd eyeLike mkdir build && cd build cmake .. make -j4编译成功后,可执行文件位于build/bin/eyeLike。
运行 eyeLike 并熟悉调试窗口
直接运行./bin/eyeLike,程序会自动调用摄像头并开始逐帧检测。运行中两个操作值得记住:按f保存当前帧为frame.png,方便离线复现问题帧;按c退出程序。
让定位更稳:eyeLike 的调优与调试手段
追踪质量一半靠环境、一半靠参数:
- 光线:避免强光直射面部,追求均匀照明;反光严重时适当调低摄像头曝光。
- 机位:摄像头与眼睛保持同一水平线,距离 50–70 cm,镜头略微下倾可减少镜面反射。
- 参数:关键常量集中在 src/constants.h。眼睛区域的四个百分比(kEyePercentTop 25、kEyePercentSide 13、kEyePercentHeight 30、kEyePercentWidth 35)决定切眼是否贴合,人脸偏大偏小时优先调它们;kGradientThreshold(默认 50.0)控制参与投票的梯度强度,定位发漂时上调、检测丢失时下调。
- 调试:把 kPlotVectorField 置为 true 会额外导出中间结果(eyeFrame.png)辅助分析,再配合 f 键保存整帧,可以离线对比不同参数组合的效果。
- 性能:降低摄像头分辨率、收紧眼睛检测区域都能减少每帧计算量,对实时性要求高时优先处理这两项。
eyeLike 能做什么:四类典型眼动交互场景
- 🎮游戏交互:视线控制角色移动、菜单选择,甚至实现"看哪打哪"的瞄准体验。
- 📚教育研究:分析课堂注意力分布、阅读时的眼球运动模式,用注视时长评估学习效果。
- ♿无障碍辅助:眼控打字、用眼神操作智能家居、为行动不便者提供非语言沟通通道。
- 🚗驾驶安全:通过眨眼频率做疲劳检测、视线偏离道路时预警,并用视线控制车载信息系统。
选型边界:eyeLike 与商业眼动仪、深度学习方案的差异
eyeLike 的优势区间是"低成本 + 完全可控":不花硬件钱、不依赖 GPU、每一行算法都能改;代价是精度与成熟度相对有限。
| 维度 | eyeLike | 商业眼动仪 | 深度学习方案 |
|---|---|---|---|
| 硬件成本 | 零(复用现有摄像头) | 约 1000–5000 元 | 中等(通常需 GPU) |
| 部署难度 | 低(编译即跑) | 中 | 高(需训练数据) |
| 实时性能 | 约 30 fps | 120 fps 以上 | 依赖硬件 |
| 定制灵活性 | 完全开源可改 | 封闭系统 | 需数据支持 |
| 学习曲线 | 平缓 | 简单 | 陡峭 |
另需说明当前能力边界:eyeLike 目前输出的是双眼瞳孔中心,属于算法参考实现;从瞳孔位置换算到屏幕注视点还缺参照点(如眼角)的完整链路,若要直接做注视点定位,需要自行补齐这一步。
排错清单:eyeLike 三类高频问题与处理步骤
编译报"找不到 OpenCV":先用pkg-config --modversion opencv确认库已正确安装;再用cmake -DOpenCV_DIR=/path/to/opencv ..显式指定路径;最后检查环境变量是否生效。
摄像头无法打开:用ls -l /dev/video0检查设备与权限;排除其他程序占用摄像头的情况;换一个摄像头索引重试。
瞳孔点频繁跳动:先改善照明、消除面部反光;再调整摄像头高度与角度;最后到 src/constants.h 微调眼睛区域比例与梯度阈值。
下一步:克隆仓库、编译、按 f 存下第一帧带瞳孔点的画面,眼动基线就搭好了。之后从 src/constants.h 的参数开始按自己的场景调优;想深入算法时,src/findEyeCenter.cpp 是梯度投票法的完整实现,配合 Readme.md 阅读效率最高。
【免费下载链接】eyeLikeA webcam based pupil tracking implementation.项目地址: https://gitcode.com/gh_mirrors/ey/eyeLike
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考