2012-03-14 19 views
14

これは私のトラッキングアルゴリズムのベースとして機能するために使用します。オプティカルフローを使用したOpenCVトラッキング

//1. detect the features 
    cv::goodFeaturesToTrack(gray_prev, // the image 
    features, // the output detected features 
    max_count, // the maximum number of features 
    qlevel,  // quality level 
    minDist); // min distance between two features 

    // 2. track features 
    cv::calcOpticalFlowPyrLK(
    gray_prev, gray, // 2 consecutive images 
    points_prev, // input point positions in first im 
    points_cur, // output point positions in the 2nd 
    status, // tracking success 
    err);  // tracking error 

cv::calcOpticalFlowPyrLK入力として、前の画像からの点のベクトルをとり、次の画像上の適切な点を返します。前の画像にランダムなピクセル(x、y)があると仮定し、OpenCVオプティカルフロー関数を使用して次の画像上でこのピクセルの位置を計算するにはどうすればよいですか?

答えて

28

あなたが書いているように、cv::goodFeaturesToTrackは入力として画像を取り、「追跡するのが良い」と思われる点のベクトルを生成します。これらは周囲から目立つ能力に基づいて選択され、画像のHarrisコーナーに基づいています。トラッカーは通常、最初のイメージをgoodFeaturesToTrackに渡し、追跡するフィーチャのセットを取得することによって初期化されます。これらのフィーチャは、シーケンス内の次のイメージとともに前のポイントとしてcv::calcOpticalFlowPyrLKに渡すことができ、次のポイントを出力として生成し、次の繰り返しの入力ポイントになります。

cv::goodFeaturesToTrackまたは類似の機能によって生成された機能ではなく、別の一連のピクセルをトラッキングする場合は、次の画像とともにcv::calcOpticalFlowPyrLKに入力します。非常に単純に、コード内の

// Obtain first image and set up two feature vectors 
cv::Mat image_prev, image_next; 
std::vector<cv::Point> features_prev, features_next; 

image_next = getImage(); 

// Obtain initial set of features 
cv::goodFeaturesToTrack(image_next, // the image 
    features_next, // the output detected features 
    max_count, // the maximum number of features 
    qlevel,  // quality level 
    minDist  // min distance between two features 
); 

// Tracker is initialised and initial features are stored in features_next 
// Now iterate through rest of images 
for(;;) 
{ 
    image_prev = image_next.clone(); 
    feature_prev = features_next; 
    image_next = getImage(); // Get next image 

    // Find position of feature in new image 
    cv::calcOpticalFlowPyrLK(
     image_prev, image_next, // 2 consecutive images 
     points_prev, // input point positions in first im 
     points_next, // output point positions in the 2nd 
     status, // tracking success 
     err  // tracking error 
    ); 

    if (stopTracking()) break; 
} 
+1

私はあなたが一度だけ機能の検出を行うことがわかります。私はこのコードをテストしました。私は、最初の画像で検出された特徴だけが追跡できることを発見しました。これらのすべての機能がイメージを超えている場合、追跡する機能はありません。 3D構築にオプティカルフローを使用する必要があります。その後、古い画像を継続的に追跡し、その間に新しい画像機能を追加するにはどうすればよいですか?ありがとう。 – Shiyu

+1

はい、 'goodFeaturesToTrack'でフィーチャを検出するだけです。オプティカルフローメソッドは単純にそれらを追跡します。各フレームで特定の数のフィーチャを維持するには、現在のフレームに対してどのくらいの数のフィーチャが正常に追跡されたかを検出し、次のフレームまで追跡するフィーチャをさらに検出する必要があります。代わりに、[このページ](http://opencv.itseez.com/modules/features2d/doc/features2d.html)の関数を使用して、すべてのフレームのフィーチャを検出し、ディスクリプタを計算し、それらのディスクリプタと一致させることもできます。 – Chris

+0

詳細が必要な場合は、新しい質問をすることをお勧めします。 – Chris

1

CV :: calcOpticalFlowPyrLK(..)関数は引数を使用しています(

CV :: calcOpticalFlowPyrLKをprev_gray、curr_gray、features_prev、features_next、ステータス、エラー);

cv::Mat prev_gray, curr_gray; 
std::vector<cv::Point2f> features_prev, features_next; 
std::vector<uchar> status; 
std::vector<float> err; 

次のフレームの画素を見つけるための最も簡単な(部分的な)コード:

features_prev.push_back(cv::Point(4, 5)); 
cv::calcOpticalFlowPyrLK(prev_gray, curr_gray, features_prev, features_next, status, err); 

画素が正常status[0] == 1features_next[0]次のフレームの画素の座標を示すであろうが判明した場合。値の情報はこの例で見つけることができます:OpenCV/samples/cpp/lkdemo.cpp

関連する問題