うにの貝焼き

ただしうには食えない

OpenCVで指定範囲内のボールの位置を特定する

自分が去年取り組んでいたものがあったので忘れないうちに概念的なやつだけでもメモ.
コードはクソ汚いので公開できません.

取り組んだこと


知能ロボコン*1でも使えるようなボールの位置取得プログラム.
基本的な機能としては,赤,青,黄の三色のボールの色を検出してそいつらの位置の座標を返してあげる感じ.

原理


入力画像は以下の画像を使用する.

f:id:Unicore32:20140712184227j:plain

しかし,この状態では座標を求めようなんてできるわけない.
そこで,透視投影*2を使用して上からボール見たような画像に変換していく.OpenCVではgetPerspectiveTransformがあるのでこいつを使用した.対応する4点を,ボールが置かれている側のフィールドにある横に引かれた黒ラインの端点である4点とした.変換すると以下のようになる.

f:id:Unicore32:20150202222418p:plain

で,こいつからボールの色と位置を読み取っていく.今回の場合,フィールド上にはボールのみ存在するので丸とかの検出は不要.そのため,はじめにラベリングを行い,そのラベリングの結果からボールの色を判定していき,座標を返すものとした.ちなみにこの画像は,HSVでないと色の指定が厄介になるのでBGRからHSVに変換してあるものとする.

そして最終的には,こういう感じで出力できた.

f:id:Unicore32:20150202222750p:plain

おわりに


今回のはこういうのも出来るよ程度で覚えたほうがいいです.多分こんな説明で理解できる人なんて到底いないのでもっとほかのサイトを見ながら独学で学びましょう.あと理解するなら線形代数はやっぱり重要.