OpenCVとasmlib-opencvとPortAudio

完全に自分用のメモで読みづらい。

これはOpenCVとasmlib-opencvとPortAudioを使ったもので、カメラの画像を解析し目とか顔の座標位置で音が鳴るだけ、ちょっとした実験。
僕の環境はVisual Studio 2010 Expressなんですが、この3つはどのような環境でも使えるはずなので、特定の環境の話は最後にまとめて書きます。
ちなみにasmlib-opencvオープンソースのQt Creatorのサンプルがあります。これを使いたかったがうまくインストールできなかった。


OpenCV
http://opencv.willowgarage.com/wiki/
今、多分2.4でその前までのバージョンと違って?簡単に使えます。
ネットの情報に右往左往し無駄に時間を使ってしまわないように、ちゃんとバージョンを確認したほうがいいです(自分に言い聞かす)。
まずインクルードのディレクトリを設定し、自身の環境に適したライブラリにパスを通します、すると準備はできてしまいます。
以下のサイトがとても参考になりましたし、ここのサンプルコードで動くのを確認しました。
http://imagingsolution.net/program/opencv/opencv2-4-dynamic-downlaod-install/

OpenCVの使い方はasmlib-opencvの解説の中で。


asmlib-opencv
http://code.google.com/p/asmlib-opencv/
このライブラリで顔や目鼻の輪郭を線でなぞるわけです。

今回使用するのはsrc以下のlibフォルダに入っているものすべて。
それからsrc以下のdateフォルダのhaarcascade_frontalface_alt.xmlとmuct76.modelの2つです。haarcascade_frontalface_alt.xmlは映像から顔を抜き出すのに使用し、muct76.modelは輪郭などに使うものだと思います。


ただここが厄介です。libフォルダ以下のファイルはこのまま使えませんでした。
このライブラリはOpenCV2用のものなのです(OpenCVは1と2で全然書き方が違っているので注意が必要なのです)。
しかしさらにこの2.4とも差異が発生しています。
それはインクルードが以下の様な書き方に変更されました、多分。

#include "opencv2\opencv.hpp"

GUIだとか使用するものに合わせてインクルードせず、上記で大概済むようになっているようです。
そのためにasmlib-opencvのインクルードの殆どを修正しなければなりません。
とはいえ、ファイル数も少ないしファイルあたり多くて2行です。
根気よくOpenCVのインクルードファイルを上記のように修正してください。


このasmlib-opencvは自分でモデルを組むことができるようなのですが、まだそこまで把握できていません。
今回は映像から画像をとって、画像から顔を抜き出し、目鼻などの輪郭を測り、そこに線や円を描画します。
src以下のdemoにあるmain.cppの一部から流れを確認。


まずASMモデルを読み込みます。そいつはmuct76.modelです。
何が行われているのか残念ながらわかりません。

asmModel.loadFromFile(modelPath);

次に顔の分類器を読み込みます。そいつはhaarcascade_frontalface_alt.xmlです。
何が行われているのか残念ながらわかりません。

cv::CascadeClassifier faceCascade;
faceCascade.load(faceCascadePath)

続いてWEBカメラの機能をオンにします。そして映像から画像を取得。

Mat img, imgT;
cv::VideoCapture capture;
capture.open(0);

capture >> imgT;

顔を検出します

objCascadeClassfifier.detectMultiScale(img,,,);

これとASMモデルをフィットさせる。フィットした座標の位置の配列を返す。

vector < ASMFitResult > fitResult = asmModel.fitAll(img, faces, verboseL);

結果を画像に描画します

asmModel.showResult(img, fitResult);

以上です。
流れはそれほど難しくありません、中で何やってるかは全然わかりませんが。
今後少しづつ理解していければ、、、。


PortAudio
http://www.portaudio.com/
これは比較的古い環境のプロジェクトファイルしかありません。
しかしcmakeが用意されているので一発で自分の環境にあったプロジェクトファイルを作ることができした。
CMakeList.txtがあるフォルダでコマンドプロンプトでcmake .とすることでプロジェクトファイルが生成される。
さて次にパスを通します。以上です。サイン波が数秒間鳴るサンプルがあるのでコンパイルしてみましょう。
流れの確認してみよう。


初期化

PortAudioStream *stream;
Pa_Initialize();

ストリームの開放

Pa_OpenStream(&stream,,,);

バッファ

buffer = new double[bs*ch];

コールバック

int paCallback(void *, 
               void *outputBuffer,
               unsigned long framesPerBuffer,
               PaTimestamp, 
               void *_ss)
{
//実際の処理
}

ストリームの開始

PaError err = Pa_StartStream( stream );

ストリームの停止

PaError err = Pa_StopStream(stream);

ストリームを閉じる

PaError err = Pa_CloseStream( stream );

終了

Pa_Terminate();

ソース(GPL)
https://dl.dropbox.com/u/78146942/src/cv_asm_pa_demo.zip



以下、書き途中。