しばらくやってないがApex Legendsを少しプレイしていた。
正直、FPSはそれほどうまくない・・・
Apex Legendsをやめる頃(かなり前)にダメージが表示されるようになった。
折角なので画像処理でテキストとして、取得できるかをやってみる。
前回GPD Pocket3でApex Legendsの動画をキャプチャしたので、これをOpenCVで読み込んで処理するのだが、今回は1フレームだけ抜き出して静止画の状態で処理することにする。
とりあえず、OCRで取得するのでTesseract OCRとpyocrをインストールする。
※ 処理の関係上、PillowとOpenCVも必要。
Tesseract OCRは以下のURLからx64版をダウンロードして、インストールした。
日本語の学習データも一応は入れたが、今回は数値なので別に入れなくてもよかったかも・・・
| https://github.com/UB-Mannheim/tesseract/wiki |
Visual StudioのPython環境からpyocrを検索してインストールした。
あとはOpenCVで読み込んだフレームを表示しながら確認して、ダメージが表示されてるフレームを画像として抜き出した。

最終的には動画から赤枠部分を抜き出して処理するが、今回はペイントツールでダメージ部分だけを切り出して、ファイルに保存したものを使用する。

背景が単色ではなく、ドットのような模様が入っているため、最初はうまく取得できずにフィルターを掛けたり、白黒を反転したりしたが、画像サイズを2~3倍にしたりして試したがどれも不要だった。
ビルダーをDigitBuilderにすることと、image_to_stringにlang=”jpn”を指定しないことで簡単に取得できた。
最終的なコードは以下のようになった。
import sys,os
import pyocr
import cv2
from PIL import Image
def init_ocr(path=r'C:\Program Files\Tesseract-OCR\tesseract.exe'):
# pyocrの初期化TESSERACT_CMDにtesseract ocrの実行パスを設定する
pyocr.tesseract.TESSERACT_CMD = path
tools = pyocr.get_available_tools()
if len(tools)>0:
return tools[0]
return None
def main():
tool = init_ocr()
# Pillowで読み込んでも良いが後のことを考えてcv2で読み込む
# OCR処理する際にカラーである必要がないのでグレースケールで読み込む
img = cv2.imread(r"D:\Resources\images\OCR\damage.png",cv2.IMREAD_GRAYSCALE)
# OpenCVのnumpy型をPillowのイメージ型に変換
pillow_img = Image.fromarray(img)
builder = pyocr.builders.DigitBuilder(tesseract_layout=6)
# 画像から数字を取得する
text = tool.image_to_string(pillow_img, builder=builder)
print('text:' + text)
if __name__ == '__main__':
main()
実行結果は次の通り。
text:450
ダメージの表示部分は0の場合は表示されないので、次は表示があるかの判定を追加したい。
今回は静止画だったので、次回は動画を処理して精度の確認も行いたいと考えている。
対象のダメージの部分は背景のゲーム画面の色が透過しているので、その影響の確認の意味もある。
OCRの最終目標としては、PC版のApex Legendsで座標情報の取得して、全体のマップに移動した経路の情報を表示したい。