OpenCV 2.4.5に更新しました

CV Drone同梱のOpenCVはGitHub上の開発版を自分の手でビルドしたものです。
※ 2013/07/11 現在は2.4.6が入っています

opencv_f77a375354.jpg

バージョンが2.4.4なのにopencv_core249.libとなっているのはそのためです。

CV Droneの機能面の更新は一段落つきましたので、先月リリースされた2.4.5を最新コミットに同梱しました。
※2013/06/02 opencv_video245.dllとopencv_video245.dllを入れ忘れていたため再コミットしました

実は開発版のOpenCVはcv::getTickCount()が違うヘッダ(core.hppではなくてutility.hpp)に移動していたため、デッドレコニングサンプルのビルドがサンプルコードそのままだと通らなかったんですよね。いやー、ご不便おかけしました。

サンプルプログラムについては、キー入力などWin32API依存になっていた部分をcvWaitKeyに切り替えています。

これでLinuxへの移植も簡単になるのではないでしょうか?
スポンサーサイト



AR.Droneで円検出

丸いマーカーを検出するには?という質問があったので、今回はcvHoughCirclesを用いた円検出を紹介します。

CV Droneにもサンプルとして収録されてあります。
https://github.com/puku0x/cvdrone/blob/master/src/samples/sample_hough_circle.cpp

手順は
1. 画像をグレースケール変換
2. ノイズ除去のため画像をぼかす
3. 円を検出が簡単になるようにエッジを出す
4. cvHoughCircles()で円検出
です。


#include "ardrone/ardrone.h"

#define KEY_DOWN(key) (GetAsyncKeyState(key) & 0x8000)
#define KEY_PUSH(key) (GetAsyncKeyState(key) & 0x0001)

// --------------------------------------------------------------------------
// main(引数の数、引数リスト)
// メイン関数です
// 戻り値 正常終了:0 エラー:-1
// --------------------------------------------------------------------------
int main(int argc, char **argv)
{
// AR.Droneクラス
ARDrone ardrone;

// 初期化
if (!ardrone.open()) {
printf("Failed to initialize.");
return -1;
}

// 画像取得
IplImage* image = ardrone.getImage();

// 画像
IplImage *gray = cvCreateImage(cvGetSize(image), image->depth, 1);
IplImage *smooth = cvCreateImage(cvGetSize(image), image->depth, 1);
IplImage *canny = cvCreateImage(cvGetSize(image), image->depth, 1);

// Cannyエッジ用の閾値
int th1 = 50, th2 = 100;
cvNamedWindow("canny");
cvCreateTrackbar("th1", "canny", &th1, 255);
cvCreateTrackbar("th2", "canny", &th2, 255);

// メインループ
while (!GetAsyncKeyState(VK_ESCAPE)) {
// 更新
if (!ardrone.update()) break;

// 画像取得
image = ardrone.getImage();

// グレースケールに変換
cvCvtColor(image, gray, CV_BGR2GRAY);

// ノイズ除去
cvSmooth(gray, smooth, CV_GAUSSIAN, 23, 23);

// エッジ検出
cvCanny(smooth, canny, th1, th2, 3);

// 円検出
CvMemStorage *storage = cvCreateMemStorage(0);
CvSeq *circles = cvHoughCircles(smooth, storage, CV_HOUGH_GRADIENT, 1.0, 10.0, MAX(th1,th2), 20);

// 円表示
for (int i = 0; i < circles->total; i++) {
float *p = (float*) cvGetSeqElem(circles, i);
cvCircle(image, cvPoint(cvRound(p[0]), cvRound(p[1])), cvRound(p[2]), CV_RGB(0,255,0), 3, 8, 0);
}

// メモリ解放
cvReleaseMemStorage(&storage);

// カメラ切り替え
static int mode = 0;
if (KEY_PUSH('C')) ardrone.setCamera(++mode%4);

// 表示
cvShowImage("camera", image);
cvShowImage("canny", canny);
cvWaitKey(1);
}

// メモリ解放
cvReleaseImage(&gray);
cvReleaseImage(&smooth);
cvReleaseImage(&canny);

// さようなら
ardrone.close();

return 0;
}

45行目でグレースケールに変換していますが、マーカーの色が赤や青であれば、YCrCbに色変換して色差成分に対してハフ変換をかければ検出しやすくなると思います。

// YCrCb用
IplImage *ycrcb = cvCreateImage(cvGetSize(image), image->depth, 3);
IplImage *y = cvCreateImage(cvGetSize(image), image->depth, 1);
IplImage *cr = cvCreateImage(cvGetSize(image), image->depth, 1);
IplImage *cb = cvCreateImage(cvGetSize(image), image->depth, 1);


// YCrCbに変換
cvCvtColor(image, ycrcb, CV_BGR2YCrCb);
cvSplit(ycrcb, y, cr, cb); // 分離
cvSmooth(cr, smooth, CV_GAUSSIAN, 23, 23); // 赤のマーカー

// エッジ検出
cvCanny(smooth, canny, th1, th2, 3);

// 円検出
CvMemStorage *storage = cvCreateMemStorage(0);
CvSeq *circles = cvHoughCircles(smooth, storage, CV_HOUGH_GRADIENT, 1.0, 10.0, MAX(th1,th2), 20);

安定して検出できるかどうかは微妙なところですが...

AquesTalk使ってみた

CV Droneに喋ってもらおうと考えて「AquesTalk」に手を出してみました。

ここからダウンロードして、
http://www.a-quest.com/products/aquestalk.html

ヘッダをインクルード、
#include <AquesTalkDa.h>

関数は同期タイプだと、
AquesTalkDa_PlaySync("ほげほげ");

非同期は、
hMe = AquesTalkDa_Create()
AquesTalkDa_Play(hMe, "ふがふが")
AquesTalkDa_Stop(hMe);

これだけで声出せるのってすごいですね。
ライブラリのサイズもとても小さいですし。

今回作ったサンプルです→aquest_test.zip

AR.Droneを動かそう(生データの取得)

AR.Droneが送ってくる速度のうち、Z方向の速度は常にゼロです。

これは速度推定を下カメラ画像のオプティカルフローで行っているからだと考えられます。
Parrotのエンジニアの人も現行のFWでは実装されていないと言っています。

navdata.vzを求める方法は、
・navdata.demo.altitudeを微分
・navdata.raw_measures.acc[2]を積分

後者はAR.Droneに生データを送ってもらう必要があります。

CV Droneではデフォルトで無効になっていますが、
"./src/ardrone/navdata.cpp"の50行目(62行目)にある

sockCommand.sendf("AT*CONFIG=%d,\"general:navdata_demo\",\"TRUE\"", seq++);



sockCommand.sendf("AT*CONFIG=%d,\"general:navdata_demo\",\"FALSE\"", seq++);

に変更することで全てのNavdataを送信してくれます。
生データはnavdata.raw_measurementsに保存されます。

NAVDATA_OPTIONフラグを送る方法はなんかうまくいきませんでした。

GitHub Wiki を使おう

現在、CV DroneはGitHub上で公開していますが、GitHubのリポジトリにWikiの機能があることに気がつきましたでしょうか?

もちろん、CV DroneプロジェクトでもWikiを用意してあります!
cvdrone_wiki_home.jpg
↑全部英語ですが

CV Drone Wikiにはビルドの方法や、
cvdrone_wiki_build.jpg

APIリファレンスなどの情報が載っています。
cvdrone_wiki_api.jpg

これらの他にもコメントや要望も随時受け付けております。お気軽にどうぞ!


さてと...、日本語版どうしようかな...

現状では、英語版との機能面での差が開いているので、ぶっちゃけめんどくさい ソースを一元化してバージョン管理を円滑にするという名目でGitHubに完全移行しようか考え中です。
プロフィール

puku

Author:puku
暇な時はゲームかプログラミングしてる人だよ。
だいたい月1更新。
CV Drone はこちら(GitHub)

最近はQiitaでOnsenUI2で遊んでいる。

最新記事
最新コメント
最新トラックバック
検索フォーム
カレンダー
04 | 2013/05 | 06
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -
月別アーカイブ
カテゴリ
スポンサードリンク
RSSリンクの表示
FC2カウンター
リンク
ブロとも申請フォーム

この人とブロともになる

アクセスランキング
[ジャンルランキング]
コンピュータ
607位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
120位
アクセスランキングを見る>>
FC2ブログランキング

FC2Blog Ranking

QRコード
QR