OpenCVとの戦い、動画にオプティカルフロー

カメラに写ったものの動作ベクトルをとるものです。
以下のアドレスに画像でのサンプルがあります。
http://opencv.jp/sample/optical_flow.html#optflowBM

恒例の罠

カメラの画像で使う場合には少々罠があるのでそれだけ記録しておきます。
とりあえずさんぷるのイメージの部分にそのままカメラの画像イメージを突っ込むと普通に怒られます。

原因は普通にcvQueryFrameでキャプチャをするとイメージのビット深度がIPL_DEPTH_8Uになっていないためです。
なので、新しいフレームをIPL_DEPTH8で作成し、キャプチャフレームからコンバートをかけます。
ここでのlframeは1フレーム前の比較用データです。

	IplImage *frame8 = cvCreateImage(cvSize( w,h ),IPL_DEPTH_8U, 1);
	IplImage *lframe8 = cvCreateImage(cvSize( w,h ),IPL_DEPTH_8U, 1);
	cvConvertImage(frame,frame8);
	cvConvertImage(lframe,lframe8);
	cvCalcOpticalFlowBM (frame8, lframe8, block, shift, max_range, 0, velx, vely);

Whileの最後に

lframe = cvCloneImage (frame);

とかで、lframeに比較用フレームを保存しておきます。

あとは上で紹介した公式ページのサンプルとほとんど同じです。


・・・
ただ・・・
重い!!
くそおもい。
Core2DuoのマシンでFPsが0.5くらいしかでない。
正直使い物に以下略、って感じですよ。