2016年8月19日金曜日

Let me find the best move for you! - バックギャモンボード画像解析

ここしばらく、バックギャモンで遊ぶことより優先して(そう、札幌オーブンにも行かずに!)取り組んできたことがあります。それはプログラミングです。

趣味のプログラミングなのですが、始めてみたら面白く、なおかつ、なかなかうまくいきません。まとまった時間が取れる夏休みになんとか形にしようと頑張ったので、ここまでのまとめを書いておこうと思います。

何を作っているかというと、「バックギャモンボード画像の解析ソフト」です。対戦中、難しい局面で写真を撮っておくことはよくあると思います。あとでXGなどで解析するためなのですが、いちいち入力するのが面倒という私のような人のために、画像から自動的にポジションを導き出せないものかと考えました。

試行錯誤の結果、まずは以下の画像を解析して、ベストムーブを出力することができました。
ただし、この画像しかうまく処理できません・・・(理由は後述)。

ざっくりとした処理の流れは以下の通りです。

1. 元画像から、ボードの枠の位置を特定する

2. 画像処理によって、チェッカーやバーの位置を求める


3. ダイスの目を認識する

4. チェッカーの配置とダイスの目を入力として、gnubgにベストムーブを計算させる

すべてのパイプライン処理がうまくいけば、ベストムーブが出てくるのですが、現状ではそれぞれのステップが甚だ脆弱なアルゴリズムであるため、最初に解析したMOGAMIボードのこの局面しか解析に成功しません。
バックギャモンボードは様々な色やデザインがあるため、それらすべてに対応することはおそらく無理なのですが、標準的なデザインのボードであれば、そこそこ解析できるようにしたいと考えています。

やってみるといろいろ難しいことがあると分かりました。例えば、このおしゃれな地場さんボード。ボードの位置は特定できるのですが、チェッカーを判定するのがとても難しいです。理由は、ボード上側のチェッカーが光の加減によってテカっていることです。こうなってしまうと、今のアルゴリズムでは歯が立ちません。赤坂は窓がない部屋でちょっとイヤだなと思っていたのですが、プログラムにとっては、四ツ谷と比べて赤坂の方が断然照明の条件が良いです。

他にも、まだ作りこんでない処理があります。
例えば、その局面を時計回りに解釈するのか、反時計回りとするかの問題です。ここはとりあえず「人力」です。プログラムで判定できるのかさえ見通しがありませんが、チャレンジしてみようと思っています。
スコアも問題です。スコアボードが写っていれば判読できる可能性はありますが、そんなもの写っていないかもしれないので、ここもとりあえず「人力」です。
そういえば、ダブリングキューブもまだ何もやってないな・・・

諸々の画像処理も、勉強しながら試しながら使っているのが現状ですが、ゲームをやっていて使える「手筋」が徐々に増えてくるような楽しさを感じます。多分私の実力は「バックギャモン入門」を読み終わった初級クラス並みで、これから勉強すべきことが山ほど残っています。

課題は山積していますが、私のバックギャモンとプログラミングに対する情熱で、すべて解決できると固く信じています。

0 件のコメント:

コメントを投稿