Apex LegendsのダメージをOCRで取得する

しばらくやってないが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で座標情報の取得して、全体のマップに移動した経路の情報を表示したい。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA