2010年12月12日日曜日

OpenCVが楽しすぎる件について

C++の勉強がてらOpenCVを触っているんだけど、これがかなり楽しい。

とりあえず、Webカムからリアルタイムに画像取得→画像から顔認識して顔部分の色を変化させる、くらいまでは簡単に出来た。




※左がカメラキャプチャした元画像、右が顔認識した部分の色を変化させたもの


一応下に使用したC++のソースを載せておく。


#include <cv.h>
#include <highgui.h>
#include <ctype.h>

int main (int argc, char **argv)
{
CvCapture *capture = 0;
IplImage *frame = 0;
IplImage *out = 0;
double w = 320, h = 240;
int c;

if (argc == 1 || (argc == 2 && strlen (argv[1]) == 1 && isdigit (argv[1][0])))
capture = cvCreateCameraCapture (argc == 2 ? argv[1][0] - '0' : 0);

cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_WIDTH, w);
cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_HEIGHT, h);

CvHaarClassifierCascade* cascade = cvLoadHaarClassifierCascade( "C:/OpenCV2.0/data/haarcascades/haarcascade_frontalface_default.xml",cvSize(1,1));
CvMemStorage* storage = cvCreateMemStorage(0);

cvNamedWindow ("Capture", CV_WINDOW_AUTOSIZE);
cvNamedWindow("Face detection", CV_WINDOW_AUTOSIZE);
while (1) {
frame = cvQueryFrame (capture);
cvShowImage ("Capture", frame);

out = frame;

CvSeq* objects = cvHaarDetectObjects(
frame,
cascade,
storage,
1.1,
2,
0,
cvSize(30,30));

for(int i = 0;i < (objects ? objects->total : 0);i++){
CvRect* r = (CvRect*) cvGetSeqElem(objects,i);
cvSetImageROI(out,cvRect(r->x,r->y,r->width,r->height));
cvAddS(out,cvScalar(200),out);
cvResetImageROI(out);
}

cvShowImage("Face detection",out);

c = cvWaitKey (2);
if (c == '\x1b')
break;
}

cvReleaseCapture (&capture);
cvDestroyWindow ("Capture");
cvDestroyWindow ("Face detection");

return 0;
}



※おまけ


お約束。

EclipseとCDTとPythonとOpenCVとわた(ry

今日も引き続きEclipseの環境構築。

OpenCVなぞをインストールしていた。

手順に関してはココを参考にしておけば間違いない。

とにかく問題になったのはOpenCVの最新バージョン2.2をインストールしてしまったこと。
上記サイトでは2.0をインストールしていて、そのとおりにやってみると確かに動く。

これが2.2をインストールしてしまうと、CDTでもPythonでも動かなかった(少なくとも自分の使っているマシンでは)…。

ソフトウェアモジュールはできるだけ安定して動くバージョンをインストールしよう、というお話。

2010年12月11日土曜日

EclipseとCDTとOpenGLと私

Eclipse+CDT+OpenGLメモ

・glutの設定はココに書いてある通り行うべし
・OpenGLプログラムを作成する際、描画関数内で頂点情報を指定したあと、swapBufferes()を忘れずに記述すること
※2010/12/12/追記:swapBuffers()は無くてもOK

2010年11月19日金曜日

ProcessingでAndroidアプリ開発

最近Processingにハマっている。

ProcessingはMITメディアラボで開発されたプログラミング言語。
メディアアートやインフォデザインなんかによく使われているらしい。

画像やインタラクションに強いため「動くモノ」、「触れるモノ」を簡単に作れるので触っててすごく楽しい。


そんなProcessingでAndroidアプリを作る方法を発見した。

…が、上記サイトの通りやってもうまく行かなかったので解決方法についてメモ。

とりあえずサイトの通りの手順だと

1.AndroidSDKをインスコ
2.Android互換バージョンのProcessingをココからゲッツ。解凍する。
3.Processingを立ち上げ、コーディング
4.コーディングし終わったら動作テスト
5.メニューバーの中にあるAndroid>Android Mode(もしくはCtrl+D)を選択。ファイルダイアログが出てくるのでAndroidSDKが保存してあるフォルダを選択する。

…ここで問題が発生した。
「Android core.zipがダウンロード出来ない」というエラーメッセージが出てきてうまくいかない。

ちょっと調べたところ、ココからファイルをダウンロードする部分がうまく動いていない様子。
上記ファイルを直接ダウンロード→Sketchフォルダに保存するとうまくいった。


…が、いざ実機にインストール、と思ったら自分が使っている端末のOSのバージョンがAndroid1.6で対応していなかった orz(エミュレータではキチンと動作しました)


まぁそれはいずれNexus Sを買ったときにでも(いつになることやら…)。


冒頭にも書きましたが、Processingはビジュアルやインタラクションに強く図形の描画、マウス、キー入力の取得が容易にできるプログラミング言語。
ということで、ゲームやデザイン系アプリのちょっとしたプロトタイプ開発に向いているんじゃないかな、と思います。

2010年10月23日土曜日

HT 03-Aの加速度センサ

HT 03-Aでプログラミングしていたときのこと。
EclipseのAndroid LogCat中に下記のような記述を発見。


10-23 14:55:42.172: DEBUG/SensorManager(4725): found sensor: AK8976A 3-axis Accelerometer, handle=0


"AK8976A"
「これはもしや、加速度センサの型番では?」
と思い、ググってみたら正解だったようで、旭化成の3軸加速度、電子コンパスICがヒットした。
データシートによるとサンプリング間隔は10~15msらしい。
つまり、SENSOR_DELAY_FASTESTで計測しても上記のサンプリング間隔より早く計測することは出来ない、ということ。

加速度センサ使ってアプリ作る人はこの点、ちょっと気を付けておいた方がいいかもです。

2010年10月12日火曜日

OEDEC2007の資料がかなり良さげ

音声処理について調べてる途中で、OEDEC2007のセッション資料を発見したのでメモ。
これが中々良さげ(以前Blogに掲載したAMDFの分かりやすい説明なんかも載っていた)。

音声処理以外にも映像やらデータ圧縮技術なんかについても掲載されているので非常に興味深い。
時間が出来たらじっくり読んどこう。

2010年10月4日月曜日

PythonWebめぐり

ウェーブレット変換の勉強中。
Web巡回して資料を探している最中にPythonでオシロ作ってるプロジェクトを発見した(一番上のヤツ)。

これは凄い…。
PyQtとかいうGUIモジュール使って作ってるらしい。

リッチなGUIをPythonで作りたいと思ってたからちょっと勉強してみたい。
これを参考にして今まで作ってきたアプリをゴージャス(爆)に改良することを目標にやってみるか。
ちょっと調べてみた感じここら辺が勉強用に丁度よさそう。

#肝心のウェーブレット変換も同じページに載ってたのでいじくってみよう。