web-dev-qa-db-ja.com

オプティカルフローを使用した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オプティカルフロー関数を使用して次の画像のこのピクセルの位置を計算するにはどうすればよいですか?

18
Alex Hoppus

あなたが書くとき、cv::goodFeaturesToTrackは入力として画像を取り、それが「追跡するのに良い」とみなす点のベクトルを生成します。これらは、周囲から目立つ能力に基づいて選択され、画像のハリスコーナーに基づいています。通常、トラッカーは、最初の画像を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;
}
29
Chris

cv :: calcOpticalFlowPyrLK(..)関数は引数を使用します:

cv :: calcOpticalFlowPyrLK(prev_gray、curr_gray、features_prev、features_next、status、err);

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] == 1およびfeatures_next[0]は、次のフレームのピクセルの座標を表示します。値情報はこの例で見つけることができます:OpenCV/samples/cpp/lkdemo.cpp

1
MSeskas