2017-05-24 11 views
2

OpenCVで実装されたLucas Kanadeを使用してSIFTまたはSURF機能を追跡することはできますが、Lucas Kanadeはまばらな機能を何らかの形で追跡するため、OpenCVで実装されたFarnebackのオプティカルフローアルゴリズムを使用しようとしています。それ?Farnebackのような高密度オプティカルフロー手法を使用してスパースな機能をトラッキングするにはどうすればよいですか?

Realtime Dense Optical flow tracking

このビデオをチェックしてください:

開発者は、彼らが「ルーカス・カナデ」の密なアプローチを使用して選択まばらな機能「Farneback」というよりもまばらなアプローチを追跡することを主張します。彼らはどうしたのですか?

+0

(https://stackoverflow.com/help/on-topic)[オントピック]確認してください。 –

答えて

2

を行うことができます。

// read images  
cv:Mat prevImg = cv::imread(filename0); // image data at time t 
cv::Mat currImg = cv::imread(filename1); // image data at time t and t + 1 
cv::Mat flowMat; // storage for dese optical flow field 
std::vector<cv::Point2f> prevPoints; // points to be track 

// initialize points to track (example) 
prevPoints.push_back(cv::Point2f(50.3f, 30.f)); 
std::vector<cv::Point2f> currPoints(prevPoints.size()); // tracked point position 

// compute dense flow field (example) 
cv::calcOpticalFlowFarneback(prevImg, currImg, flowMat, 0.4, 1, 12, 2, 8, 1.2, 0); 

// track points based on dense optical flow field and bilinear interpolation 
for(unsigned int n = 0; n < prevPoints.size(); ++n) 
{ 
    float ix = floor(prevPoints[n].x); 
    float iy = floor(prevPoints[n].y); 
    float wx = prevPoints[n].x - ix; 
    float wy = prevPoints[n].y - iy; 
    float w00 = (1.f - wx) * (1.f - wy); 
    float w10 = (1.f - wx) * wy; 
    float w01 = wx * (1.f - wy); 
    float w11 = wx * wy; 
    if(prevPoints[n].x >= flowMat.cols - 1 || prevPoints[n].y >= flowMat.rows - 1) 
    { 
    // these points are out of the image roi and cannot be tracked. 
    currPoints[n] = prevPoints[n]; 
    } 
    else 
    { 
    /* 
    bilinear interpolation of the flow vector from the flow field at a given location. 
    The bilinear interpolation has to be applied since the points to track can be given at subpixel level 
    */ 
    currPoints[n] = prevPoints[n] 
       + flowMat.at<cv::Point2f>(iy, ix) * w00 
       + flowMat.at<cv::Point2f>(iy+1, ix) * w10 
       + flowMat.at<cv::Point2f>(iy, ix+1) * w01 
       + flowMat.at<cv::Point2f>(iy+1, ix+1) * w11; 
    } 
} 

} 
+0

ありがとう、私はあなたのコードをテストしています。 1つの最後の質問:flowMat.at (iy、ix)* cv :: Point2f(w00、w00) - >この要素は賢明な乗算であるのか、これはopencvでは動作しないためです。 – Akef

+0

申し訳ありません2Dベクトル用のクロス積は意味がありませんので、要素賢明な乗算を意味すると仮定しています。 – Akef

+0

ありがとう、ちょっと働いていますが、いくつかのものを修正しなければなりませんでした – Akef

0

OpenCVにはcalcOpticalFlowFarneback()という機能があります。次のように密なオプティカルフロー場flowと機能を追跡するために

+1

私はこの関数について知っています、ファーンバックの方法は、すべてのピクセルのための密な意味であるモーションフィールドを与えますが、私の質問はどのように疎なキーポイントや機能のセットを追跡するためにファーンバックの関数を使用できますか? – Akef

関連する問題