Skip to content

sybupt/EyeFocus

Repository files navigation

EyeFocus — 自助智能视力检测工具

Godot GB 11533 Platform License

自助智能视力检测系统(EyeFocus),是一款融合智能算法、嵌入式硬件、无线交互的全自动视力筛查设备,以 “无人值守、精准高效、自助便捷” 为核心理念,彻底替代传统人工视力检测,打造智能化、标准化、低成本的视力筛查新方案,助力青少年近视防控、医疗体检智能化升级。

  • 自助智能视力检测系统(EyeFocus),基于 Godot Engine 4.6 开发的专业视力自测应用,严格遵循 GB 11533 国家标准对数视力表(E 字视标),在屏幕上实现物理精确的视力测量,并支持热敏打印机输出报告:

🔥 国标级智能测视软件,基于 Godot Engine 4.6 开发,严格遵循 GB 11533-2011 国家标准,内置像素级视标校准算法与自适应阶梯检测算法,实现全自动、无人工判读的精准视力检测;

🔥 嵌入式热敏打印模块,自研专用驱动电路,集成 EM5820H 热敏打印机,检测完成后自动输出标准化视力报告;

🔥 双模式无线交互模块,支持蓝牙体感枪(AriGun)与远程控制键盘双模式,受检者全程自助响应,无需医护人员干预。

  • 系统具备零人工干预、检测精准、效率极高、部署灵活、数据可追溯等优势,不仅适配医院诊前分流、体检中心自助检测,还可用于校园大规模筛查、社区公益检测、家庭日常自测,应用场景广泛,市场前景广阔,助力推动医疗健康与人工智能技术的深度融合。

功能特性

特性 说明
标准对数视力表 14 级标准(0.10 ~ 2.00),严格遵循国标
物理精确算法 根据显示器尺寸、分辨率、距离精确换算视标像素
双 / 单眼模式 左眼、右眼独立测试,数据分开记录
自适应网格 视标网格动态排列,智能计算行列数与间距
专注全屏模式 一键隐藏 UI,全屏仅视标,沉浸测试
自适应阶梯 连续答对 3 次升级,答错 2 次降级
参数校准 自定义显示器尺寸、分辨率、测试距离
热敏打印 支持 EM5820H 串口打印机输出报告
红圈呼吸 目标视标由红色呼吸动画圆环标记

界面截图

EyeFocus 界面截图 EyeFocus 界面截图

黑色/白色极简风格,三分栏横屏布局,1280 × 720 分辨率。


安装与运行

系统要求

  • Godot Engine 4.6+(推荐 .NET 版本)
  • 任意支持 Godot 4 的操作系统(Windows / macOS / Linux)

运行方式

git clone https://github.com/Euler-lne/eye-focus.git
cd eye-focus
# 用 Godot 4.6 打开项目根目录,点击运行即可

或者直接下载源码,用 Godot 编辑器打开 project.godot,按 F5 运行。

导出发布

在 Godot 编辑器中选择 项目 > 导出,按需配置导出模板即可生成独立可执行文件。


使用方法

基础流程

① 选择模式  →  ② 参数校准  →  ③ 遮挡眼睛  →  ④ 判断朝向  →  ⑤ 按键作答  →  ⑥ 打印报告
  1. 启动应用后,在左侧面板选择检测模式(左眼 / 右眼 / 双眼依次)
  2. 点击「参数校准」输入显示器尺寸与测试距离
  3. 根据提示遮挡相应眼睛,与屏幕保持 5 米标准距离
  4. 观察中央区域被红圈标记的 E 字视标,判断开口方向
  5. 使用方向按钮或键盘快捷键作答
  6. 测试完成后点击「生成最终结果」,连接打印机一键打印报告

快捷键

按键 功能
W / 开口朝上
A / 开口朝左
S / 开口朝下
D / 开口朝右
ESC 退出专注模式

模式说明

  • 左眼模式 — 仅测试左眼,请遮挡右眼
  • 右眼模式 — 仅测试右眼,请遮挡左眼
  • 双眼依次 — 先测左眼再测右眼,数据分别记录

参数校准

为确保视力结果准确,测试前务必校准!

校准参数:

  • 显示器对角线尺寸(英寸)
  • 屏幕分辨率(宽 × 高)
  • 测试距离(米,建议 5 米)

提示:默认 24 英寸 1920×1080, 5 米。笔记本电脑或小尺寸显示器请务必校准。

专注模式

点击「专注模式」隐藏所有 UI 面板和鼠标光标,全屏仅视标,适合远距离沉浸测试。按 ESC 退出。

打印报告

应用内置对 EM5820H 热敏打印机的支持,通过串口连接后即可打印格式化视力报告:

╔══════════════════════════════════╗
║           EyeFocus
║        专业视力自测报告
║  ────────────────────────────────
║  测试时间: 2026-05-21 14:35:54
║  测试标准: GB 11533  距离: 5m
║  ────────────────────────────────
║
║    左眼视力      右眼视力
║      1.00          1.00
║
║  ────────────────────────────────
║  参考区间  正常视力 >= 1.0
║  视力正常,建议定期复查
║  ────────────────────────────────
║      本报告仅供参考
║    如有异常请到医院就诊
╚══════════════════════════════════╝

无打印机时自动切换为终端模拟模式,输出相同格式的 ASCII 边框报告。


项目架构

eye-focus/
├── project.godot                 # 项目配置
├── icon.svg                      # 应用图标
├── font/
│   └── SourceHanSansSC-Regular-2.otf  # 思源黑体
├── scenes/
│   └── main.tscn                 # 主场景 UI 布局
├── scripts/
│   ├── Main.gd                   # 主控制器
│   ├── EyeChart.gd               # E 字视标渲染
│   ├── OptotypeContainer.gd      # 视标网格容器
│   ├── TestController.gd         # 测试流程控制
│   ├── VisionCalculator.gd       # 视力值计算
│   ├── VisionLevelManager.gd     # 视力等级管理
│   ├── PrinterManager.gd         # 打印机管理
│   └── CalibrationPanel.gd       # 校准面板
├── addons/
│   └── gdserial/                 # 串口通信插件
└── imgs/
    └── screenshot.png            # 界面截图

核心模块

模块 文件 职责
主控制器 Main.gd UI 协调、事件处理、信号转发
视标渲染 EyeChart.gd _draw() 绘制标准 E 字,旋转四方向
网格布局 OptotypeContainer.gd 动态行列计算,红圈呼吸动画
测试流程 TestController.gd 答题验证、状态更新、视标刷新
视力计算 VisionCalculator.gd GB 11533 公式,像素换算
等级管理 VisionLevelManager.gd 14 级标准表,3 对 2 错算法
打印管理 PrinterManager.gd EM5820H 串口打印,终端模拟

核心公式

笔画宽 (mm)    = tan( 1分角 / 视力值 ) × 测试距离 (mm)
视标边长 (mm)  = 5 × 笔画宽            (5×5 栅格,5 个等宽单元)
视标边长 (px)  = 视标边长 (mm) × 像素密度 (px/mm)

验证:V=1.0,距离 5m → 视标边长 ≈ 7.272 mm,与国标完全吻合。

自适应阶梯算法

答对 3 次 → 升级(视力值增大,视标变小)
答错 2 次 → 降级(视力值减小,视标变大)

左右眼数据完全独立存储,14 级递进:0.10 → 0.12 → 0.15 → 0.20 → 0.25 → 0.30 → 0.40 → 0.50 → 0.60 → 0.80 → 1.00 → 1.20 → 1.50 → 2.00。

EyeFocus 视力测试算法总结

一、视力等级变化规则(动态调整视标大小)

  • 升级条件:在当前视力等级上连续正确 3 次,且当前等级不是最高(2.0),则视力等级提升一级,视标变小。
  • 降级条件:在当前视力等级上连续错误 2 次,且当前等级不是最低(0.1),则视力等级降低一级,视标变大。
  • 说明:升级/降级只影响当前测试中的视标大小,不直接决定最终视力。

二、最终视力确定规则(累计正确达标)

  • 每个视力等级独立累计正确次数:每答对一次,该等级的正确计数器加 1。
  • 达标阈值:当某个等级的累计正确次数达到 10 次时,该等级被认定为该眼睛的最终视力。
  • 确定顺序:左右眼分别统计;哪个等级先累计满 10 次,该眼睛的最终视力就定为那个等级;若多个等级同时达标,则取最高等级。
  • 测试结束:当一只眼的最终视力确定后,程序自动记录结果并切换到另一只眼或弹出最终结果。

三、双眼依次模式流程

  • 开始:选择“双眼依次”模式后,默认从左眼开始测试,初始视力等级为 1.0。
  • 左眼测试:根据红圈指示的 E 字方向答题;程序会动态升降当前等级,同时后台累计每个等级的答对次数。
  • 左眼完成:当左眼某个等级累计正确达到 10 次(例如 1.2 先达标),系统记录左眼最终视力,并切换到右眼;右眼的所有等级计数重置为 0,视力等级恢复为 1.0。
  • 右眼测试:重复上述过程。
  • 全部完成:右眼也达到某个等级累计正确 10 次后,自动显示最终结果窗口,给出左右眼各自最终视力。

四、重置与模式切换

  • 重置测试:将左右眼的所有等级累计正确计数清零,当前视力等级恢复至 1.0,并清零连续正确/错误计数。
  • 单眼模式切换:切换到左眼或右眼单独测试时,仅清空该眼的累计计数,另一只眼状态保留。

五、算法优势

  • 抗随机猜测:累计正确 10 次的概率极低(纯随机猜对需要约 10 次正确,概率 < 0.0015%),能有效防止运气成分。
  • 允许失误:不要求连续正确,用户偶尔答错不会重置累计计数,更符合真实测试场景。
  • 自适应难度:通过连续正确/错误快速调整视标大小,使测试始终围绕用户实际视力水平进行。

双眼依次模式(收敛策略)

  • 工作流程:双眼依次模式会先测左眼再测右眼;每只眼都采用“连续答对 3 次升级 / 连续答错 2 次降级”的阶梯策略,同时记录每个等级的累计正确次数。只要某个等级先达到 10 次正确,该眼的最终视力就会被确定并切换到另一只眼。

  • 注意:双眼依次并非简单取两次独立测量的平均值,而是依靠阶梯策略与累计达标判据来获得更稳定、更符合实际视力水平的最终结果。

校准与开始前准备(重要)

  • 在开始任何测试前,请务必先进入「参数校准」并确认或设置显示器的对角线尺寸(英寸)与当前分辨率(宽 × 高)。物理像素密度(px/mm)由这两项决定,直接影响视标的物理尺寸换算,校准错误会导致视力结果偏差。

  • 建议在设备首次部署或切换显示器时,按实际屏幕规格填写参数;若不确定尺寸请手动测量屏幕对角线后填写。

演示视频

项目内已包含录屏演示与真人演示,用于展示软件界面与完整检测流程(位置:videos/screen_record.mp4videos/live_demo.mp4)。

  • 屏幕录制(已包含):videos/screen_record.mp4 — 包含参数校准、单眼/双眼检测流程与打印示例。
  • 真人演示(已包含):videos/live_demo.mp4 — 真实受检者操作示范,可直接在页面中播放。

页面(index.html)已增加“演示”栏目,展示以上视频;如需替换,请将新文件放入 videos/ 目录并同步更新页面中的视频源。


技术细节

项目 说明
引擎版本 Godot 4.6
开发语言 GDScript(纯原生)
渲染器 GL Compatibility
分辨率 1280 × 720(横屏 16:9)
拉伸模式 canvas_items
视力标准 GB 11533 / ISO 8596
打印机 EM5820H 热敏打印机(串口 9600)
串口插件 GdSerial v0.3.0(跨平台)
运行平台 Windows / macOS / Linux

许可证

本项目仅供学习和个人使用。如需商用请咨询作者。


EyeFocus — 让视力自测更专业

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors