2012年12月4日火曜日

OpenCVでOpticalFlowを試してみた


OpenCV2.4.3でLucas-Kanade法がサポートされているので試してみた

calcOpticalFlowPyrLKは、指定した特徴点集合に対してのみオプティカルフローを計算する仕様なので、事前に GoodFeaturesToTrackDetectorを用いて、特徴点集合を求めておく

特徴点集合は、以前は、GoodFeaturesToTrackで直接特徴点の座標を求められたが、2.4.3からは、Detectorオブジェクトを作成し、detect メソッドでkeypointを計算し、そこから特徴点の座標を取得する必要がある

std::vector<cv::KeyPoint>  keypoints;
std::vector<cv::Point2f>   points;

cv::GoodFeaturesToTrackDetector detector(100, 0.05, 3);
detector.detect(gray_prev, keypoints);

for( std::vector<cv::KeyPoint>::iterator itk = keypoints.begin(); itk != keypoints.end(); ++itk)
{
points.push_back(itk->pt);
}

注意
ひとつ前のフレーム画像の特徴点を求めておく


calcOpticalFlowPyrLKは、以下のように使用する

std::vector<cv::Point2f>   newpoints
std::vector<unsigned char>  status;
std::vector<float>              errors;

cv::calcOpticalFlowPyrLK(gray_prev, gray, points, newpoints, status, errors, cv::Size(21,21), 3, cvTermCriteria (CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 20, 0.05), 0);

newpointsには、前のフレームでの特徴点に対応する今のフレームでの座標が格納されている。

statusには、検出の成否が格納されている。statusが1の場合は、検出に成功

ただし、対応する移動先が見つからない場合もあり、座標点ごとに検出が成功したかどうかは、格納される。

errorsには、計算した時の誤差にあたる数値が格納されている



以前から提供されているAPIだが、2.4.3から入力に自分で作成したピラミッド画像を使用することができるらしいが、関数自身がピラミッド画像を作成する機能を有しているようなので、今回は、グレースケールの画像を入力とした。

後半に続く

0 件のコメント:

コメントを投稿