はじめに
以前にリアルタイムでゲーム画面を OCR し、画面内の特定のワード部分に枠線を表示するアプリケーションを作成しました。しかし、何度か使用しているうちに OCR 精度が低く、枠線の表示漏れがかなりあることに気づきました。そこで今回、より精度の高い OCR ライブラリがないか検証しました。
本記事は C# を使用した Windows 向けアプリを前提としています開発することを前提としています。
実行環境
実行環境は以下の通りです。
- OS: Windows 11 Home(25H2)
- CPU: Core i7-9700F(3.00GHz)
- メモリ: 32 GB
- GPU: 未使用(各ライブラリは CPU で動作させます)
検証に使用したソース
検証するライブラリ
検証するライブラリは下記の4つです。
1. Windows.Media.OCR
C# の標準 OCR 機能(Nuget 不要)です。
以前作ったアプリケーションはこの機能を使用しています。
2. Tesseract
オープンソースの OCR エンジンです。
Hewlett-Packard、Google によって開発されました。
3. oneocr
Windows の SnippingTool アプリで使用される OCR ライブラリです。
使用には非公開 API を叩く必要がある上に、OS が更新されると動かなくなるリスクもあります。
4. PaddleOcr
Baidu が開発したオープンソースの OCR モデルです。
オープンソースとはいえ、Baidu は過去に Simeji で入力データを無断送信していた問題を起こした企業なので、取り扱いには注意です。
検証方法
下記の2つのゲーム画像を OCR し、実行速度と精度面を検証します。
二値化などの前処理は行いません。
検証結果
OCR 実行時間(ミリ秒)と OCR のテキスト抽出結果を元画像にプロットしたものを各ライブラリごとに検証しました。
1. Windows.Media.Ocr
選択画面ではサムズアップマークを"0"と誤認したり、"力"(漢字のちから)を"カ"(半カナのか)に読み間違えてはいますが、おおよそ問題のない精度です。
素質画面では大きなカードの説明は認識しているものの、画面右側の小さなカードの名前は全く認識できていません。また、アイコンや図形などの誤認識が多く、精度がかなり低くなっていることが分かります。
実行時間は両方とも 137 ミリ秒と高速です。
2. Tesseract
テキストは全く認識されませんでした。
ゲーム内画像は文字以外のノイズが多く、更に濃淡の関係で二値化(Tesseract は二値化を行ってから推論する)がうまくいかなかったので、精度が出なかったものと思われます。
一応何枚か試したところ、1枚だけ認識できたので載せておきます。
かみ合うとそれなりの精度で認識してくれますが、実行時間が 1.5 秒と長いです。
3. oneocr
選択画面はほぼ完ぺきに認識しています。唯一水流アイコンを文字と誤認識している程度で、それ以外に誤認識は見当たりません。
素質画面では"氷"を"永"、"狂"を"圧"などの読み間違えや、2つほどアイコンを文字と誤認識している個所がありますが、画面右側のカード名やカード左上の数字ですらかなりの精度で認識しています。
更には実行時間も 300 ミリ秒前後と精度と速度のバランスが驚異的です。
4. PaddleOcr
選択画面では左上のアイコンや右下のアイコンなどいくつか文字と誤認識しています。更に左と真ん中の"レベル"が全く違うテキストとして誤認識されています。
素質画面では相変わらずアイコンを文字と誤認識している個所が目立つものの、テキスト部分はほぼ完ぺきに認識しています。間違えているのは右上の"氷"を"水"程度ですね。
実行時間は約1.5秒とかなり遅いです。ただし、これは CPU を使用した場合なので、GPU を使用できればもっと早くなると思います。
総評
検証結果を以下の表にまとめました。
| ライブラリ | 精度 | 速度 | 総合評価 | 備考 |
|---|---|---|---|---|
| Windows.Media.Ocr | △ | ◎ | 〇 | 一番高速 |
| Tesseract | × | × | × | ゲーム画面には不向き |
| oneocr | ◎ | 〇 | ◎ | 精度も速度も申し分ない |
| PaddleOcr | 〇 | × | △ | 速度と企業的に難あり |
そして最終的な結果としては
- 安定を求めるなら Windows.Media.Ocr
- 非公開の API を許容できるなら oneocr
- GPU 使用と Baidu を許容できるなら PaddleOcr
- Tesseract はゲーム画面の OCR に向いてない…
です。
さいごに
oneocr のクオリティがあまりにも高くて驚きました。
Windows.Media.Ocr じゃなくて oneocr を C# の標準として組み込んでほしいです。










