OpenCVのお勉強

今年の(大学ロボコン改め)学生ロボコンのテーマはバトミントン。熊大ロボコン部は2次ビデオ審査で落ちてしまったが、これからは画像認識技術も必須と煽っていたら、画像認識の勉強をしたいと言ってきた。そこで4月から週1回ペースでOpenCVなどの勉強会を開いてきた。

まずは開発環境の用意。Windowsのcygwin上に構築することにし、このページに従って準備をしてもらった。いつものことであるが、このような情報を公開していただいて、大変助かる。ありがたい。が、linuxやcygwinに不慣れなメンバーが環境を構築できるまでに数週を要した。

いったん環境ができてしまうと、ネット上にあるソースコード、例えばOpenCV.jp : OpenCV逆引きリファレンスにあるものを、そのままコピーし動かすことができる。 で、いろいろサンプルプログラムを試しているうちにわかってくる。 OpenCVでは、関数レベルで提供されている機能、例えば直線や円を認識するというようなことは簡単にできるが、それ以外のことをやろうとするとぐっと難しくなる…というか、プログラムでやりたいこと、OpenCVが提供している機能などを理解する必要がある。当たり前の話ではある。

驚くのは、顔認識はサンプルプログラムやデータが提供されているので簡単にできることだ。 カラーボールの認識は、サンプルプログラムなどが提供されていないので、結構難しくなる。ネットで検索すると、いろんな人がOpenCVでカラーボールの認識や追跡を行うプログラムを公開されている。それらがそれぞれ違うのは、同じくカラーボール認識と言っても、求める性能などがそれぞれ違うから。みんな自分が必要なプログラムを作る必要がある。

OpenCVの勉強会では、サンプルプログラムをいろいろ試してもらったあとは、カラーボール認識に挑戦してもらった。

最終的には、フィールドを認識してロボットを動かすようなことができるようになって欲しい。九州大学で行われる夏ロボの自律ロボット部門に出場するというので、そのフィールドを認識し、ロボットの位置と向きを推定できるようにさせたい … が、結構難しい。

本番の競技フィールドは 2.6m x 2.6mの正方形だが、準備するのが大変なので 大体1/3ということで 90cm x 90cmで作成し、フィールド認識のプログラムの作成を試みた。ある程度、位置を合わせこんでやればフィールドを認識し、位置と方向を推定できるプログラムができた。が、誤認識が多く、実用にはならない。 認識結果を画面に表示させてやると、なんか、それっぽくて楽しい。

元画像

元画像

cv::canny で輪郭抽出

cv::canny で輪郭抽出

cv::HoughLineP で直線抽出

cv::HoughLineP で直線抽出

フィールド認識と位置推定

フィールド認識と位置推定

夏ロボは来週末で、もう間に合わないと思うが、画像で外界環境を認識するのは面白いので、なにか形を変えて続けていきたいと思う。OpenCV + Raspberry Piでマイクロマウスとか良いのかもしれない … というか、画像認識は、それなりに面倒くさいので、具体的な目標を立てないと勉強を続けられない。

Leave a Reply

メールアドレスが公開されることはありません。