在上一篇文章中我说了我佩戴 OK 镜的过程,在整个过程中,我发现最烦人的就是这个角膜地形图了。因为这个必须要用那个非常昂贵且巨大的设备才能拍摄。尤其是在我靠眼罩压镜片的那段时间,如果能每天都得到这个角膜地形图的反馈,我就可以立即知道哪里出了问题。后来我发现,还真有这样的解决方案:https://github.com/microsoft/SmartKC-A-Smartphone-based-Corneal-Topographer/tree/main 这是微软实验室做的一个项目,虽然很老旧,但好在有详细的文档。我成功的复现了结果:

由于模具变形,比较边缘的位置地形实际上已经没有参考性,但相对中央区域还是可以很好的看出 OK 镜的效果的。尤其右眼压得很深很居中,而左眼就相对差了一些。
现在我就记录一下整个实现过程,希望能够帮到更多的人。
硬件
整个项目硬件打开可以分为三部分:
- 手机
- 电路板
- 3D 打印的模具
手机
手机这个很好理解了,你得有个设备来拍照。——但还真有点要求。由于是要拍眼球,是近距离拍照,所以要求你的手机默认镜头有一定的微距能力。而现在主流旗舰都是长焦,这一点要注意,不然你的镜头根本没法清楚对焦到眼球。
官方给出了实测可兼容的设备列表 OnePlus 7T, OnePlus 6T, Samsung Galaxy A52s 5G, Xiaomi Pocophone F1, 我买到了 Samsung Galaxy A52s 5G,效果如文章开头的照片。
基本上,任何手机 1200 万像素以上,并且对焦距离在 75mm 或者更近就可以的。这一点上如果你能买到以上列表中的设备,那就没有坑。(你需要一个手机壳,毕竟直接将模具粘在手机上不是不行但并不方便取下)
电路板
其实这个电路板就是控制了一个环形的 led 灯,它并没有任何其他功能。

控制器长这样 (ATTINY85),我是在这里买到的,我搜了搜,淘宝上其实有,注意型号和外形完全一样即可。
然后是灯,我也是在同一家店买的(WS2812 12bit rgb):

我搜了搜可能比 ATTiny85 要难找一点,淘宝上并不能直接搜到,但理论上型号一致,12位彩色就行。
买到之后需要一点点焊接能力将他们连在一起:
| 开发板 | LED 灯圈 |
| 5v | 5v |
| grd | grd |
| p1 | d1 |
刷代码
这里注意,由于这个板子比较旧了,我实测是无法成功在 mac 上写入代码的。我猜测可能是出在 typec 转换这一块,但并不能确认。后来我换 Windows 后,即使插在 usb3 的接口,也能顺利刷入,一次成功。
这里值得注意的是,官方教程里给的链接 http://digistump.com/package_digistump_index.json 早就过期失效了,可用的链接是这个: https://raw.githubusercontent.com/digistump/arduino-boards-index/refs/heads/master/package_digistump_index.json
在添加到 Arduino IDE 后,不需要去选择 Contributed,而是直接搜索 digis,点击安装。
模具
我在模具这一块花了很多功夫,普通打印机并不能很好的打印这个模具。难点有两个,一个是很多店铺只能打黑色模具,而扩散器(那个锥形的东西)需要白色导光,需要注意。另一个是遮光罩内部结构十分脆弱,普通 pla 的话出来的东西你很难拆掉支撑部分,大概率里边的结构就跟着一起掉下来了。当然理论上你可以进一步清理然后粘回去,应该也是能用的。
我最终是找到这家成功打印:

不过遗憾的是,他们在邮寄的时候为了保护遮光罩里边的结构,塞了过多的填充物,反而是填充物把结构压变了形。这一点需要注意,可以把扩散器套在上面或者干脆三个东西组装起来再发货。
软件
软件部分一个是手机app,用来拍照。另一个是在电脑端进行运算生成地形图的python代码。由于这个计算过于复杂,恐怕是很难把他们放进手机里实时出图了。不过 SmartKC 提供了另一种方案,就是用 Azure functions,拍照后自动上传,functions 拿到照片云端计算。目前我还没有这个需求,在拍照后,我是手动连线到电脑导出照片,用python计算的。
APP
代码是可以正常运行的,下载 Android Studio 后直接打开项目目录编译到手机就好了,很粗糙但能用的app
实际拍摄的时候,你需要等待 LED 补光灯稳定白色,然后再拍。另外它会每只眼睛自动拍摄三次,焦点和中心点找对后会自动触发拍摄,对于单人操作也十分友好。
Python
这部分比较复杂,我是 macOS,显然他们是在 Windows 上完成的。而且,Python 3.8 已经过于老旧,我用目前 macOS 内置的 3.10 运行成功了。
首先配置环境:
|
1 2 |
python3.10 -m venv .venv .venv/bin/python -m pip install --upgrade pip setuptools wheel |
然后安装依赖,这里注意要跳过 nvidia-* 相关的包:
|
1 |
grep -v '^nvidia-' requirements.txt | .venv/bin/python -m pip install -r /dev/stdin |
最后把你的照片和生成的csv都从手机中取出来,放到一个目录里,比如 user_image,然后执行
|
1 2 3 4 5 6 7 8 9 10 11 |
.venv/bin/python main.py \ --n_mires 22 \ --working_distance 75.0 \ --camera_params "4.8 6.4 4.755" \ --model_file ./data/ring_distribution.txt \ --base_dir user_image \ --center_selection auto \ --mire_seg_method dl \ --mire_loc_method graph_cluster \ --output_dir output \ --verbose |
总结
以上都是我的踩坑记录,总的来说你还是需要查看这个完整的文档 https://github.com/microsoft/SmartKC-A-Smartphone-based-Corneal-Topographer/blob/main/hardware/README.md 软件部分相对简单,对我来说最困难的就是找店铺打印这个模具和想办法用 mac 刷那个控制器。显然,不行,你必须用 Windows,不要再走弯路。
我目前还在和眼科医生交流,等看看这个结果和他们专业机器相比,究竟有多大的可比性,能不能具有真实的参考价值。如果后续我有空的话,我会考虑把安卓方面的代码优化一下,还有尝试将 python 部分封装优化一下之类的。
本文由 落格博客 原创撰写:落格博客 » SmartKC 低成本角膜地形图方案
转载请保留出处和原文链接:https://www.logcg.com/archives/4228.html