見出し画像

Pythonで雀魂の対局結果を自動集計する①

こんにちは!カツキチです。

とあるDiscord内で夜な夜な行われている雀魂の友人戦について、2025年1月から対戦結果を集計することになりました。
特に賞品や賞金が出ることはありませんが、ただ目的もなくやるよりも数字として見えることにより、やる気は出ますよね。
ちなみに1月の結果は以下の通りでした。

  1. かいとんぱ +57.5 【2011】

  2. こーじ        +44.1 【1000】

  3. まはろ        +33.0 【4582】

  4. YASU          +26.7 【7346】

  5. ゲスト        +25.2 【1000】

  6. りょーちん    -1.7 【1312】

  7. ざっきー        -2.1 【1230】

  8. 北海             -13.2 【6868】

  9. カツキチ      -16.7 【4424】

  10. 藤山            -29.6 【4545】

  11. YABUKI      -131.5 【0123】

これ、どのように集計していたかというと、対局後にDiscordに投稿された結果画面のスクリーンショットを、北海Jrさんという方がすべて手計算で集計してくれていました。

雀魂の対局結果

この時、画像なので「名前」「素点」「順位点」はすべて手入力する必要があり、結構な負荷になると感じていました。
1月の対局数は31局でした。
北海さんが表計算ツールを使っていたかはわかりませんが、毎回それなりの時間を使って集計していたことは間違いありません。

(すすきのでラーメンをおごってもらった恩義もあるので)2月からの対局は集計の自動化を試みようと思い、ひとまず完成しました。

このnoteでは完成に至ったプログラムの試行錯誤を、何回かに分けて投稿していきます。

大まかなフロー

ひとえに「結果を集計する」といっても何がどうなれば嬉しいのかを考えるため、フローを策定してみました。

  1. (対局した人が)対局結果のスクリーンショットをDiscordにアップする

  2. アップしたスクリーンショット画像から名前、素点、順位点を抽出する

  3. 抽出した情報を記録する

  4. 記録した情報から当月の対局結果をDiscordに投稿する

1は人間がやること。2~4は1をトリガーにしてコンピュータがやること。
ひとつひとつ機能を分解して作っていきます。

対局結果画像からテキスト情報を抽出する

以前から興味があった分野です。少し調べたところ、Tesseract-OCRという光学文字認識ソフトウェアがよさそうです。またTesseract-OCRと相性が良く、以前から興味があったPythonを使うことにしました。開発環境としてはWindows 11+Visual Studio Codeです。

Microsoft StoreからPythonをインストール
Visual Studio Codeでの開発

Tesseract-OCRのインストール

以下のサイトからVersion 5.5.0のexeファイルをダウンロードしてインストールします。
Home · UB-Mannheim/tesseract Wiki · GitHub

雀魂の対局結果画面に表示されるプレイヤー名が日本語の場合が多いため、Tesseract-OCRのインストーラでJapaneseとJapanese (vertical)を選択します。(Additional script dataとAdditional language dataのいずれも)
これにより日本語の文字認識が可能となります。以下は参考にしたサイトです。
Python+Tesseractによる画像処理でOCRを試してみた! - 株式会社ライトコード

サンプルコード Ver 0.1

手っ取り早く文字認識をさせてみます。参考にしたサイトはこちらです。
【Tesseract】Pythonで簡単に日本語OCR #初心者 - Qiita

作成したコードはこちら。

import os
import pyocr
from PIL import Image

# PATH設定
TESSERACT_PATH = 'C:\\Program Files\\Tesseract-OCR' #インストールしたTesseract-OCRのpath
TESSDATA_PATH = 'C:\\Program Files\\Tesseract-OCR\\tessdata' #tessdataのpath
os.environ["PATH"] += os.pathsep + TESSERACT_PATH
os.environ["TESSDATA_PREFIX"] = TESSDATA_PATH

# OCRエンジン取得
tools = pyocr.get_available_tools()
tool = tools[0]

# OCRの設定 ※tesseract_layout=6が精度には重要。デフォルトは3
builder = pyocr.builders.TextBuilder(tesseract_layout=6)

# OCR処理
img = Image.open("image.png")
txt_pyocr = tool.image_to_string(img, lang='jpn', builder=builder)
txt_pyocr = ''.join(txt_pyocr.split())

print(txt_pyocr)

必要なライブラリのインストール

PS > pip install pillow pyocr

使用した画像はこちら。

image.png

さて、気になる実行結果は・・・

PS > python.exe .\sample_v0.1.py
く_閲雀魂-じゃんたま-|麻雀を無各④XX十ーーローXをQ。DDぱgame.mahjongsoulcom/indexhtmlいいじじ@:器ロロcoカクスー(店いい電思。。グーシー、』/<江りょーちんさん6。|3、=(の45700+35.77+0ん廊で"上4-てと1gi2ダー古本夏彦のjo。.KG26話語和きいら和光、噴Ss。mmodーー』志学っ者同ぜ@。.あ信中>のアシ1・也8明-。いいるいい電導昌也ナパテン「ビョンョ1滞)でN4閣sGo|人Nw副は合っ6900衣放記品る6いいにきき|ノーャリツーーL_|・のNL、6、は=国人検索ーー』-皿な回画図 皿回【o】⑨へのし0あをるあ本の 

うーん、画像全体からいろいろな箇所の文字を認識していますね。
ここから必要な情報のみを精度高く認識するにはどうしたらよいものか。
次回へ続きます。

いいなと思ったら応援しよう!