[Python][画像処理][ポーカー]ハンドレンジ表を文字列データに変換するツール作ってみた


#概要
pythonの画像処理でポーカーのハンドレンジ表を [GTO+](https://www.gtoplus.com)や[PioSOLVER](https://www.piosolver.com)と呼ばれるポーカーの分析ソフトで使う、分析元データ(文字列データ)に変換するツールを作ってみました。その実行環境構築や使用方法を書きます。
#想定読者
・[GTO+](https://www.gtoplus.com)、[PioSOLVER](https://www.piosolver.com)、[PokerSnowie](https://pokersnowie.jp)などのポーカーの学習ソフト使ってる人
・pythonとか知らんけど、とりあえずハンドレンジ表を文字列データに変換するツールを使ってみたい人
##デモ
まずは入力画像を作成します。このツールでは、[PokerSnowie](https://pokersnowie.jp)と呼ばれるポーカーのトレーニングソフトウェアのmac版のハンドレンジ表を入力データとしています。(今後の機能拡張で色々なハンドレンジ表にも対応できるようにする予定です。)スクリーンショットでハンドレンジ表の画像をPNG形式で保存します。(JPEG等は非推奨)

####入力画像(サンプル)
![aa.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1736265/e4f8fa06-8ee4-249b-6454-d8eaf8dce8dc.png)

上記の入力画像を引数にターミナル画面(Windowsだとコマンドプロンプト画面)で以下のコマンドを実行します。オプションの説明は後ほどします。

```
python read_poker_rangetable.py -a raise -gto -img sample.png -type snowie_mac
```
####出力結果
```
python read_poker_rangetable.py -a raise -gto -img sample.png -type snowie_mac
GTO+のハンドレンジ出力結果
AA,AKs,AQs,AJs,ATs,A9s,A8s,A7s,A6s,A5s,A4s,A3s,A2s,AKo,KK,KQs,KJs,KTs,K9s,K8s,K7s,K6s,K5s,K4s,K3s,K2s,AQo,KQo,QQ,QJs,QTs,Q9s,Q8s,Q7s,Q6s,Q5s,[78]Q4s[/78],AJo,KJo,QJo,JJ,JTs,J9s,J8s,J7s,[87]J6s[/87],ATo,KTo,QTo,JTo,TT,T9s,T8s,T7s,[85]T6s[/85],A9o,K9o,Q9o,J9o,T9o,99,98s,97s,[85]96s[/85],A8o,K8o,[11]98o[/11],88,87s,86s,[86]85s[/86],A7o,77,76s,75s,A6o,66,65s,64s,A5o,55,54s,[59]53s[/59],A4o,44,33,22
```


上記のコマンドで出力された結果をポーカーの分析ソフト(今回はGTO+)に結果を貼り付けることで、ハンドレンジ表を作成することができます。手作業でハンドレンジ表を作成する場合と比べ、短時間で分析元データの作成ができます。
![スクリーンショット 2021-06-28 18.29.40.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1736265/0d8ea210-5516-63a3-40ee-78b50aee4573.png)







#実行環境構築手順
###Macの場合
[・python3(pip3)のインストール](
http://netsu-n.mep.titech.ac.jp/~Kawaguchi/python/install-mac/)
[・Homebrewのインストール](
https://qiita.com/zaburo/items/29fe23c1ceb6056109fd)
python3(pip3)をインストールしたらターミナル画面から以下のコマンドを実行します。
(sudoコマンドでパスワード入力を求められたら自分のPCのパスワードを入力します。)

```
#pip のバージョンが古いと失敗する場合がある．一度、アップグレードする．
sudo pip3 install --upgrade pip
#Pillowをインストール
sudo pip3 install Pillow
#opencv-pythonをインストール
sudo pip3 install opencv-python
#pyocrをインストール
sudo pip3 install pyocr
```

Homebrewをインストールしたらターミナル画面から以下のコマンドを実行してTesseract OCRをインストールします。

```
brew install tesseract
```

###Windowsの場合
[・python3(pip3)のインストール](https://qiita.com/kenichixgt/items/bfcbfdbe8ec6ee3a2508)
[・Tesseract OCRのインストール](https://gammasoft.jp/blog/tesseract-ocr-install-on-windows/)

python3(pip3)をインストールしたらコマンドプロンプト(管理者権限で開く)から以下のコマンドを実行します。(sudoコマンドでパスワード入力を求められたら自分のPCのパスワードを入力します。)

```
#pip のバージョンが古いと失敗する場合がある．一度、アップグレードする．
pip3 install --upgrade pip
#Pillowをインストール
pip3 install Pillow
#opencv-pythonをインストール
pip3 install opencv-python
#pyocrをインストール
pip3 install pyocr
```
#実行
まずは、以下から、ソースを取得します。
https://github.com/tetsujin47/poker_range_table_read
ページ内の[Code]をクリック→[Download ZIP]をクリックしてソースをダウンロードします。zipは解凍して任意のディレクトリ配下に置きます。
![f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1736265/fe28a6f9-5d3b-825b-c873-dba870d613de.png)

次は、入力画像(サンプル)のような画像を用意して以下のコマンドを実行します。
コマンドの説明は以下です。

```
python read_poker_rangetable.py -action {raise,call} [-gto | -pio] -img IMG -type {snowie_mac,snowie3_win,snowie4_win}

(例)ハンドレンジ表の画像データのタイプがMac版PokerSnowieであるsample.pngを入力して、レイズレンジのGTO+の文字列データに変換する。
python read_poker_rangetable.py -action raise -gto -img sample.png -type snowie_mac

#省略値で実行する場合は
python read_poker_rangetable.py -a raise -gto -i sample.png -t snowie_mac
```
|オプション|説明|
|:---|:---|
|-action(省略値 -a) raise又はcall|取得したいレンジを指定する。raise=レイズレンジ、call=コールレンジ|
|-gto又は-pio|出力する文字列データの種類を指定する。-gto=GTO+の文字列データ、-pio=PioSOLVERの文字列データ。何も指定しない場合はどちらの文字データも出力する。|
|-img(省略値 -i) <画像ファイルのパス> |ハンドレンジ表の画像データ(PNG形式)のパスを指定する。|
|-type(省略値 -t) <ハンドレンジ表のタイプ>|読み込むハンドレンジ表の種類を選択する。指定できる値は「-typeに指定できる値」参照。|

###-typeに指定できる値

|ハンドレンジ表のタイプ|-typeに指定する値|
|:---:|:---:|
|Mac版PokerSnowie|snowie_mac|
|Windows版PokerSnowie3|snowie3_win|
|Windows版PokerSnowie4|snowie4_win|
|スマホアプリ版PokerSnowie|未対応(今後対応するかも)|
|Zeros|未対応(今後対応するかも)|
|その他|未対応(今後対応するかも)|
その他のオプションもあります。詳細は以下で確認できます。

```
python read_poker_rangetable.py -h
```
#実行が上手くいかない場合
----作成途中-----
・認識色のデータを修正する。
・Tesseract OCRの実行ファイルパスを通す。
・精度が高い学習データを使用する。
----作成途中-----

#補足
・解像度の悪い画像は数字部分が上手く読み込めません。解像度(1680x1050)のmacでハンドレンジ表をスクショで撮った画像は上手く読み込めていました。
・WindowsだとフルHDの解像度(1920×1080)以上が推奨です。
・画像読み込み時に、マス目の外枠は自動で検出するのですが、読み込む画像は「入力画像(サンプル)」のように他のものが写って無いものを使用してください。
・文字認識（OCR）エンジンには、googleのTesseractを使ってます。数字の識字率は98%前後だったので、少し自分の手で修正が必要です。(Mac版PokerSnowieのハンドレンジ表を読み込む場合は、数字の認識に間違った可能性がある箇所を自動で検出し、ターミナルに出力する機能もついてます。)

#参考：動作確認済み実行環境
####Macの場合
|名称|バージョン|
|:---|:---|
|macOS Big Sur|11.4|
|python|3.7(バージョン3以上が推奨)|
|Tesseract OCR|4.1.1(バージョン4以上が推奨)|
|Pillow        |8.2.0|
|opencv-python| 4.5.2.54|
|pyocr      |   0.8|
####Windowsの場合
|名称|バージョン|
|:---|:---|
|Windows 10|Windows 10|
|python|3.9.5(バージョン3以上が推奨)|
|Tesseract OCR|5.0.0(バージョン4以上が推奨)|
|Pillow   |8.3.1    |
|opencv-python|4.5.2.54|
|pyocr    |0.8      |

#参考文献
https://www.piosolver.com

https://www.gtoplus.com

https://pokersnowie.jp

https://qiita.com/hatt_takumi/items/5f88cafc82f5e31e6375