自走BeagleBoard(その7) 〜カメラにサーボをつけた〜

BeagleBoard台車のカメラが上下するようにサーボをつけてみました。
これで高い位置にある熱帯魚の水槽の様子も確認できます。(笑)


また、子供のラジコンのタイヤをもらったので付けてみました。
少しの段差なら乗り越えられるようになりました。

自走BeagleBoard(その6) 〜テニスボール追跡〜

自走BeagleBoardでテニスボールを追いかけるようにしてみました。

すでに半年以上前になってしまいましたが、前の記事でボールを認識するところまでできていたので、ボールの位置を元に機体の向きを変えて、ボールが正面にある場合は前に進むようにしています。
ボールが近くにある時に自機の陰になって見えなくなってしまうため、カメラの位置を高くして、上から見下ろすようにしてみました。


また、最近購入したAndroidタブレットからでもコントロールできました。

OpenCV カメラの遅延の対策

うちの環境(BeagleBoard-xM + Ubuntu11.04 + OpenCV2.3.0)だけの問題かも知れませんが、重い画像処理を行うと、カメラの映像がひどく遅延してしまう現象が発生しています。

例えば、BeagleBoardで顔認識を行うと3FPSぐらいになります。3FPSであれば0.3秒程度遅延するのは分かりますが、実際には2〜3秒ぐらい遅延してしまいます。3秒も遅延すると画像認識した結果でロボットを制御するのは難しいと思います。


対策として、


frame = cvQueryFrame (capture);
を数回繰り返して取得したイメージを捨てると遅延は少なくなります。しかし、無駄な処理を行っているようで納得できません。(実際、FPSも下がります。)
これで改善されることから、バッファリング関係の処理が影響していることは分かりました。


OpenCVのcvSetCapturePropertyで設定する、CV_CAP_PROP_POS_FRAMESやCV_CAP_PROP_FPSあたりのパラメータで回避できないかいろいろ試してみましたが、うまくいかず。OpenCVのソースを調べてみると、実装されていませんでした。。。


そこで、最後の手段で、OpenCVのソースを変更してみました。(これが正しい対応方法かどうかはわかりませんし、何か副作用がある可能性は高いです。)


OpenCV-2.3.0\modules\highgui\src\cap_libv4l.cpp の


#define MAX_V4L_BUFFERS 10
#define DEFAULT_V4L_BUFFERS 4
のところを

#define MAX_V4L_BUFFERS 1
#define DEFAULT_V4L_BUFFERS 1
のように変更して、OpenCVコンパイルしなおしました。


この方法で、FPSは下がらずに、遅延もFPS相当程度(3FPSなら0.3秒ぐらい)になりました。
しかし、処理が速い場合にはFPSが上がらなかったりする副作用があるかもしれません。

自走BeagleBoard(その5) 〜OpenCVで顔画像認識2〜

前々回笑い男ハッキングの画像を変更して、メガネにしてみました。(プログラムの変更はしていません。)
顔の位置に自動的にメガネを描画します。


メガネの通販サイトに売り込みできるかも!(笑)
髪型も同じようにできますね。美容院に売り込みできるかも!(笑)

自走BeagleBoard(その4) 〜OpenCVでボール認識〜

OpenCVでボール認識に挑戦してみました。


カメラから取り込んだ、↓こんな画像で、、、




↓ボールを認識しているところ。
RGBをHSVに変換して、HSVの各値の範囲で認識しています。
小さいゴミは無視して、一番大きな領域を抽出します。




色域の範囲を固定で指定しているので、照明の明るさや色合いでうまく認識できなくなってしまいます。動的に調整する方法が課題です。

ボールの追いかけはすぐにできそうです。
今回は野球ボールを使いましたが、ロボカップジュニアサッカーのボールをカメラで認識するのは難しそうです。まあ、ジュニアサッカーのボールはIRセンサで調べればよいのですがね。
次回はロボカップジュニアサッカーのゴール色も認識してみます。

自走BeagleBoard(その3) 〜OpenCVで顔画像認識〜

前回の自走BeagleBoardはカメラの画像をOpenCVを通してからブラウザに送っていて、OpenCVを使って画像処理ができるようにしていました。
今回はOpenCVで定番の顔画像認識に挑戦してみました。
このあたりはOpenCVの世界でBeagleBoardは関係ないという説もあります。


下の映像はROBOCON Magazine No.29(だいぶ古いです)の表紙を映してみたところです。
顔と認識した領域を赤枠で囲っています。
ここまでできれば人の顔を追跡するロボットはすぐにできそうです。


おまけで、笑い男ハッキング機能を搭載しました。(笑)

自走BeagleBoard(その2)

台車に載せたBeagleBoardをブラウザから操縦できるようにするプログラムを作りました。
カメラの画像を見ながら操縦できます。


ブラウザの画面はこんな感じです。インターネットに公開すれば外から操作もできますね。留守番ロボにもなりそうです。


WEBアプリなのでipodからも操作できます。


カメラの画像はOpenCV経由で読んでいます。今後、画像認識にも挑戦してみるつもりです。