今月から新しい職場で働いていますが、少しずつ慣れてきました。
会社の往復の時間を有効に使いたいと思ってノートPC買いました。
高確率で座席に座れるのでコードごりごり書いてます。
さて、カードを認識したいというお題。
いくつか方法がありそうだけども、認識できるかどうか実験してみないことにはわからないので、メモ程度のブログエントリーです。
試行錯誤やりながら実装するために、2つのプログラムを作ったほうがよさそう。
1、カードを認識するためのデータを生成するプログラム
2、実際にカードゲームで遊ぶ時に使うプログラム
画像の認識方法(思いつき)
1,カードを認識するためのデータを生成する
1-1, GaussianBlur()でフィルタをかけて輪郭抽出の準備
1-2, FindContours()で輪郭を抽出する
1-3, 輪郭のモーメントを求める
1-4,Hu不変モーメントを求める
2, 上記1の手順で生成したデータを読み込む
2-1, デュエル卓の画像を撮影し、上記の1~4までの手順を行う
2-2, MatchShapes()でHu不変モーメントの一致度を調べる。
概念メモ
うまくいかなかったとき、ここに戻ってきて考え直すためのメモ。
・輪郭抽出前フィルタかける理由=ノイズを取り除くため。一般用語でいうと画像をぼかすことに相当。=目視で動作確認済。
・FindContoures()で抽出される輪郭はたくさんあるのでは?=出力形式をツリー構造にしておいて、カードの外枠と内枠を検出する。それを「カードかもしれない」として次のステップへ入力試みる
・輪郭の特徴を数値で表現すれば比較しやすい=モーメント
・カメラの傾きやカードの傾き、カードとの距離でモーメントの値は変わるのでは?=不変モーメントは回転、拡大、平行移動に対して不変な値なのでOK。
ざっくりとこんな感じ?
じっくり考えながらやっていきましょう。
モーメントの数式は今の僕じゃ理解不能なので、どのように動作するかという点から掘り下げながら考えていったほうがよさそう。モチベーションを保つためにも。