在上一篇文章中我說了我配戴 OK 鏡的過程,在整個過程中,我發現最煩人的就是這張角膜地形圖了。因為這必須要用那個非常昂貴且巨大的設備才能拍攝。尤其是在我靠眼罩壓鏡片的那段時間,如果能每天都得到這個角膜地形圖的回饋,我就可以立即知道哪裡出了問題。後來我發現,還真有這樣的解決方案:https://github.com/microsoft/SmartKC-A-Smartphone-based-Corneal-Topographer/tree/main 這是微軟實驗室做的一個項目,雖然很老舊,但好在有詳細的文檔。我成功的複現了結果:

由於模具變形,比較邊緣的位置地形其實已經沒有參考性,但相對中央區域還是可以很好的看出 OK 鏡的效果的。尤其右眼壓得很深很居中,而左眼就相對差了一些。
現在我就記錄整個實作過程,希望能夠幫助更多的人。
硬體
整個專案硬體開啟可以分為三個部分:
- 手機
- 電路板
- 3D 列印的模具
手機
手機這個很好理解了,你得有個設備來拍照。——但還真有點要求。由於要拍眼球,是近距離拍照,所以要求你的手機預設鏡頭有一定的微距能力。而現在主流旗艦都是長焦,這一點要注意,不然你的鏡頭根本沒辦法清楚對焦到眼球。
官方給出了實測可相容的設備清單 OnePlus 7T, 一加6T, 三星 Galaxy A52s 5G, 小米 Pocophone F1, 我買了 Samsung Galaxy A52s 5G,效果如文章開頭的照片。
基本上,任何手機 1200 萬畫素以上,並且對焦距離在 75mm 或更近就可以的。這一點上如果你能買到以上清單中的設備,那就沒有坑。(你需要一個手機殼,畢竟直接將模具黏在手機上不是不行但不方便取下)
電路板
其實這個電路板就是控制了一個環形的 led 燈,它沒有任何其他功能。

控制器長這樣 (ATTINY85),我是在這裡買到的,我搜了搜,淘寶上其實有,注意型號和外形完全一樣即可。
然後是燈,我也是在同一家店買的(WS2812 12位元RGB):

我搜了搜可能比 ATTiny85 難找一點,淘寶上並不能直接搜到,但理論上型號一致,12位元彩色就行。
買到之後需要一點點焊接能力將他們連在一起:
| 開發板 | LED 燈圈 |
| 5v | 5v |
| 格魯德 | 格魯德 |
| 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 後,不需要去選擇 貢獻,而是直接搜尋 digis,點選安裝。
模具
我在模具這一塊花了很多功夫,普通印表機並不能很好的列印這個模具。難點有兩個,一個是很多店家只能打黑模具,而擴散器(那個錐形的東西)需要白色導光,需要注意。另一個是遮光罩內部結構十分脆弱,普通 pla 的話出來的東西你很難拆掉支撐部分,大概率裡邊的結構就跟著掉下來了。當然理論上你可以進一步清理然後黏回去,應該也是能用的。
我最終是找到這家成功打印:

不過遺憾的是,他們在郵寄的時候為了保護遮光罩裡邊的結構,塞了過多的填充物,反而是填充物把結構壓變了形。這一點需要注意,可以把擴散器套在上面或乾脆三個東西組裝起來再出貨。
軟件
軟體部分一個是手機app,用來拍照。另一個是在電腦端進行運算產生地形圖的python程式碼。由於這個計算過於複雜,恐怕是很難把他們放進手機裡即時出圖了。不過 SmartKC 提供了另一個方案,就是用 Azure functions,拍照後自動上傳,functions 拿到照片雲端運算。目前我還沒有這個需求,在拍照後,我是手動連線到電腦匯出照片,用python計算的。
應用程式
程式碼是可以正常運作的,下載 Android Studio 後直接開啟專案目錄編譯到手機就好了,很粗糙但能用的app
實際拍攝的時候,你需要等待 LED 補光燈穩定白色,然後再拍。另外它會每隻眼睛自動拍攝三次,焦點和中心點找對後會自動觸發拍攝,對於單人操作也十分友好。
蟒蛇
這部分比較複雜,我是 macOS,顯然他們是在 Windows 上完成的。而且,蟒蛇 3.8 已經過於老舊,我用目前 macOS 內建的 3.10 運行成功了。
首先配置環境:
|
1 2 |
python3.10 -m venv .venv .venv/bin/python -m pip install --upgrade pip setuptools wheel |
然後安裝依賴,這裡注意要跳過 英偉達-* 相關的包:
|
1 |
grep -v '^nvidia-' requirements.txt | .venv/bin/python -m pip install -r /dev/stdin |
最後把你的照片和產生的csv都從手機中取出來,放到一個目錄裡,比如 使用者影像,然後執行
|
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