2012年2月5日日曜日

Optical Flow (Block Matching)

OpenCVのサイトにあったVer.1, 1.1用ブロックマッチングのサンプルコードを試してみました。
http://opencv.jp/sample/optical_flow.html#optflowBM
先日入れたVer.2.2、2.3.1に追加で古い1.1を入れてから試してみました。

が、動きません。以下のエラーが出ます。
OpenCV Error: Sizes of input arguments do not match () in unknown function,file ..\ocv\opencv\modules\video\src\optflowbm.cpp, line88
このファイルはタイムスタンプよりVer.1.1ではないようです。中身をみると、どうも以下の個所で引っかかったようです。
    CvSize velSize =
    {
        (srcA->width - blockSize.width)/shiftSize.width,
        (srcA->height - blockSize.height)/shiftSize.height
    };
    if( !CV_ARE_SIZES_EQ( srcA, srcB ) ||
        !CV_ARE_SIZES_EQ( velx, vely ) ||
        velx->width != velSize.width ||
        vely->height != velSize.height )
        CV_Error( CV_StsUnmatchedSizes, "" );
サンプルコードでは以下のように設定されており、このサイズ違いがエラーの原因になったのでしょう。
rows = int (ceil (double (src_img1->height) / block_size));
  cols = int (ceil (double (src_img1->width) / block_size));
  velx = cvCreateMat (rows, cols, CV_32FC1);
  vely = cvCreateMat (rows, cols, CV_32FC1);
ちなみに、velxのサイズの計算式がVer.1.1と2.1の説明で異なっています。
http://opencv.jp/opencv-2.1/c/motion_analysis_and_object_tracking.html
仕様変更でしょうか?Ver.1のサンプルを動かす時は、当たり前ですがVer.1のみの環境にしておいたほうがよいのでしょう。今回は上位Ver.でファイルを上書きしてしまったのかもしれません。

とまあ、アタリはついたので、サンプルコードの rows、cols の計算式を2.1と合うように変更してやりました。結果、問題なく動きました。

実際に画像処理を行うときは、block_size や shift_size を画像の特徴や欲しい解像度に合わせて調整する必要があるようです。コンパイラー上で動かした方が良さそうですね。
これで、実装されているアルゴリズムのうち、LK, HS, BM の3種は用意できました。

0 件のコメント:

コメントを投稿