2012年12月6日木曜日

OpenCVでOpticalFlowを試してみた 後半


結果の表示
  特徴点の数だけループをまわし、指定した特徴点が次フレームで移動したのかを判定する。

 判定方法は、獲得頂点に対応するstatusの値を調べ、その値が1ならば、newpointsに移動先と推定された座標が格納されることになる
 あと、対応するerrorの値をしらべ、想定した値以上の場合は、破棄するほうが結果はよいと思われるが、今回は調べていない

 有効であれば、pointsの位置に、サークルを表示し、pointsの位置から、newpointsの位置まで直線を描画する。


calcOpticalFlowPyrLKのパラメータに関して
 cv::Size(21,21)は、移動先の判定に使用すウィンドウサイズの大きさであり、大きくすると性能は上がるが計算量が増える
 21はデフォルトの値である。

 その後の3は、ピラミッドの階層数であり、大きいほど大きな移動に対応できるが、計算量が多くなる。
 0から指定するので、値が3の場合(デフォルト)は、元の大きさの画像に加えて、縮小サイズの画像を3枚作成し、それぞれ調べることになる。


 その後のパラメータは、変更してもそれほど結果に差異はないように思われる。

高速化
 OpenCV 2 Computer Vision Application Programming CookBookのサンプルでは、上記の有効と判定した移動先の座標が、想定した数以上であれば、その座標を次のフレームの特徴点として使用することで、次フレームでの特徴点の処理を省いている。

 今回は、有効な移動先座標に次フレームで検出した特徴点を加えて、calcOpticalFlowPyrLKを計算している。

OpenCV 2 Computer Vision Application Programming Cookbookは、kindle版が、安いのだが、残念ながら日本から買うと3800円でお買い得感はない


感想
 ・こちらがほしいと思われる場所のベクトルをほとんどら得ることはできない
 ・人物の場合、頭、手の先、足の先が特徴点として検出されやすいが、人の移動方向と、得られたベクトルの方向とを比較すると、頭 手 足 の順で相関がなくなっていく。結果、人の追跡はむつかしい
 

 サンプル画像だけでも、ほかにも多くの問題が見つかり、他の手法と組みあわせないと、役に立たないと思われる

0 件のコメント:

コメントを投稿