有玩《Pikmin Bloom》的玩家都知道,遊戲中的大蘑菇(例如「一般 神秘蘑菇」或「一般
紅色蘑菇」)被推毀後需要一段時間才會重生
。為了精準掌握下一次搶菇的時機,我決定透過 NotebookLM 的協助, 動手寫一個小工具:只要上傳包含挑戰剩餘時間(如「剩下20
分 47 秒」或「剩下1 小時 1 分 58 秒」)的遊戲截圖
,系統就能自動推算出精確到秒的重生時間。 一開始我只上傳了一張 Pikmin 打菇的截圖, AI 就根據我的要求自動根據左上角的系統時間與圖中剩餘時間等資訊, 告訴我要安裝相關 OCR 套件, 並開發出第一個版本的程式, 這個程式已經大致完成了我的需求, 但離實用還有一小段距離, 所以在持續改進的開發過程中,我遇到了幾個有趣且經典的技術挑戰(對於這些影線處理, OCR, 圖片 EXIF info 等知識, 我是沒有太多的經驗, 但在 AI 一步一步的引導下完成了我的需求),在此與大家分享:
一、
影像預處理:拯救低迷的 OCR 辨識率 一開始,我直接將遊戲截圖丟給 Tesseract OCR
引擎,但辨識結果慘不忍睹。原因是遊戲畫面背景太過複雜(充滿草地、花朵與蘑菇發光特效)
,且文字是白色的。 為了解決這個問題,AI 引入了 OpenCV
進行影像預處理。先將圖片精準裁切,只保留左下角的血條與時間區域,接著轉為灰階並放大兩倍,最後使用二值化(經過測試閾值
200 得到不錯的效果)並反轉顏色。這個步驟成功將複雜的畫面轉換成 Tesseract
最容易辨識的「白底黑字」,大幅提升了準確率, 但在做更多的不同截圖的測試, 閾值 200 並不能成功轉換成 OCR 能辨識的黑白圖, 因此我請 AI 調整成以 200 為基礎, 如果辨識失敗, 在調整成 210, 190, 220, 180 如果都失敗才判定無法辨識(下圖是調整後的圖形)。
二、 對抗 OCR 的奇妙誤判與高容錯
Regex
解決了影像問題,接著是文字解析。遊戲字體中的無襯線數字「1」非常容易被誤判為英文字母
l、I、直線 |,甚至在辨識「1 小時」時被讀成 ]小時 。
為此,我設計了一套高容錯率的正規表達式
(Regex):(?:([0-9lIi|\]\[]+)\s*小?\s*時\s*)?(?:([0-9lIi|\]\[]+)\s*分\s*)?([0-9lIi|\]\[]+)\s*秒。它將「小時」與「分」設為可選
(Optional),並搭配一個自訂的清理函式,把所有形狀像「1」的干擾字元強制替換回數字
1,完美避開了 OCR 的各種奇妙誤判, 此外就算是二值化轉換後的圖, 人可以辨識, 但 OCR 還是常常辨識失敗, 我詢問 NotebookLM 後, AI 給了幾個非常有用的建議, 包含: 修改 PSM 參數 --psm 11、移除英文語言包(因為我的皮克敏是繁體中文版, 讓 OCR 專注繁體中文的辨識)、改 OCR Engine Mode 為 --oem 1 (用人工神經網路引擎)與設定 DPI 參數為 --dpi 300。 經過這些修改後, 果然大幅度的提高二值化轉換後圖的辨識成功率。
三、 尋找真相(從 Metadata 挖掘「截圖的精準時間」 計算重生時間需要一個基準點):如同我前面提到, AI 一開始根據左上角的時間作爲現在時間的基準來計算, 菇菇摧毀時間與菇菇重生時間, 但 iphone 螢幕的顯示時間並不含秒數, 對於搶菇實在沒有太多的幫助, 因此我要求 AI 改成用圖片的產生時間當做現在時間。最初 AI 使用前端 JavaScript
抓取檔案的最後修改時間,但這在圖檔經過通訊軟體傳輸或網頁上傳時往往會失真。
為了追求極致準確,AI 改用 Pillow (PIL) 套件深入挖掘圖檔的
Metadata。程式會優先讀取圖片底層的 EXIF 標籤(如 36867 DateTimeOriginal),或是
iOS 截圖特有的 PNG tEXt chunk(Creation
Time)。如果這些資訊不幸遺失,才會退回使用前端傳遞的修改時間作為保底。
四、使用 NotebookLM 開發心得:
1. 在沒有相關背景知識(影像處理、OCR 、圖片資訊等) 僅使用一個下午的時間, 就完成了約四個版本解決了大部分開發過程所遇到的問題, 隔天又根據新的想法(自動調整二階化參數) 又花了約半個小時就完成目前版本, 中間花最多的時間是我測試所花的時間, AI 開發產生程式的速度非常的迅速。
2. 開發過程, AI 主動幫我加入許多實用的功能, 例如: 給我產生處理過後的二階化後的圖片的選項, 讓我可以更快知道後續 OCR 可能遇到的問題、在網頁上顯示 OCR 後, 系統判斷的結果(可參考上圖)、在沒有給太多資訊下(僅上傳皮克敏打蘑菇時的截圖), 從網路上找到皮克敏的背景知識協助開發。
3. 本文的主架構, 是根據我與 NotebookLM 的對話開發過程, 我請 AI 幫我總結寫成此文的主匡架後再修改了一些內容完成。
最終,我使用 Flask 將這整套邏輯包裝成了一個輕量級的 Web
App。這個專案不僅解決了遊戲痛點,更是一趟結合了 OpenCV 影像處理、Regex
除錯與檔案 Metadata
解析的有趣實踐。科技,果然就該用在這些讓生活(與遊戲)更美好的小地方!
未來我還想增加一些功能, 目前想到的是判斷出下次重生菇的時間後, 可以一鍵加入網頁倒數時間, 更方便打菇。
如果你對我的程式有興趣, 可以參考:
https://github.com/wkliu/Pikmin_Mashroom_Calculator


留言