麻雀牌認識のプロセスを考える

image

■目的

こんな画像から、14牌を認識する、とする。この画像自身の切り出しをどうするのか?って問題があるけど、麻雀牌自体は手元に置くことが多いし、ある程度画像認識の範囲を絞り込むことができるだろう…という仮定からスタートする。もちろん、これは「仮定」なので、前提条件が間違っている場合も頭の隅に入れておく。

■手順を考察

いきおい、牌の物体認識から入ってしまうと思われるが、それは駄目だ。というか無駄だ。牌の形は「四角」で固定されているし、牌の表面は主に白でおおわれている。さらに背景は、白以外(大抵は緑のマット?)なのだから、わざわざ物体認識という大層なことをやらなくてもいい。白っぽい部分を抽出すれば、牌と特定できるだろう。

さらに、この場合は牌が14個連なっている。多少上下にずれているが、だいたいは真ん中で一直線になっている。牌の数は決まっていて、14個であるのだから、先に大まかな位置が分かったら、単純に14等分すればそれぞれの牌の位置がわかるだろう。もちろん、上下のずれ、左右のずれ(カメラ位置のずれ)などを考慮するために若干ずらした牌の位置でも確認が必要になる。

牌の大まかな位置がわかったら、個別の牌を認識させる。これは特徴量抽出かテンプレートマッチングでよい。たぶん、テンプレートマッチングでも十分なスピードが出るのではないだろうか?牌の種類自体は、たかだか9×3+7=28種 花牌などを入れれば36種しかない。アルファベットよりも少ない。大文字小文字を区別する必要もないし、似ている文字(ゼロとオーとか)もないので、ほとんど誤認識はせずに済むだろう。教師画像は多少の上下の揺れと、上下さかさまの画像を用意しておけばよい。グレースケールのテンプレートマッチング法で十分だと思う。

赤牌をどう認識するかだが、これはテンプレートマッチングした後にあらためて色で識別すればよい。伍萬など決まっているから、それで特定ができる。

牌が特定できたら、後は自由に待ちとかを計算すればOK。

■認識の流れ

  1. 背景色とは異なる、白っぽい部分を特定する。
  2. 白っぽい部分は、横長と仮定する(先行きは、縦長やななめでも良い)
  3. 白っぽい横長の牌並びの、左端と右端の位置を特定する。
  4. 左端と右端で14分割する。
  5. 14分割した牌の位置に対して、テンプレートマッチングする。テンプレートマッチは上下逆さまの場合と上下の位置の揺れも教師画像として用意する。
  6. 牌の特定ができる。

これでやってみよう。

カテゴリー: OpenCV パーマリンク