2012-09-27 66 views
2

我試圖做這樣的事情: http://www.youtube.com/watch?feature=player_embedded&v=MIYt1yNwoZU光流:幾點

,我在正確的道路,它的工作原理以及2小時的編碼。但我有一些問題:

  • 我使用的是opencv 2.4,並且有一些選項..請參閱here。哪一個是最好的?盧卡斯kanade與一些自動功能檢測?或者一個簡單的全球定位就足夠了?甚至卡爾曼濾波器?現在我正在使用一種密集的法爾內貝爾算法,我認爲它是第一個(更簡單)的選項,但也許並不是最好的選擇。

  • 在計算了圖像上的光流後(因爲計算光流的因子爲2,因爲這是一項艱鉅的工作),我取這些矢量的平均值。正常平均值,將它們相加併除以矢量數。所以在流動墊上嵌套循環。更好的方法?

    Point2f average_motion(0,0); float n=1; 
    
    for(int y = 0; y < flow.rows; y += step) 
        for(int x = 0; x < flow.cols; x += step) { 
    
         const Point2f& fxy = flow.at<Point2f>(y, x); 
    
         if(abs(fxy.x) > threshold || abs(fxy.y) > threshold) { 
          average_motion += fxy; 
          n++; 
         } 
    
        } 
    average_motion *= 1/n; 
    
    average_motion *= 1/n; 
    cout << average_motion << endl; 
    
  • 我移動rects但左/右移動似乎有點有點不可思議,而不是向上/向下作品真的很好!有人可以解釋我爲什麼?

  • 翻譯是好的,但我卡在旋轉..如果我得到的平均向量我怎麼能獲得學位?我嘗試過使用X軸向量之間的角度,但是效果不好。一些提示?

  • 現在我畫的東西跟OpenCV的繪圖API,但是從2.4也有OpenGL的支持..而應該是不錯的,但我沒有找到例如對..

+0

您是否嘗試過使用姿勢估計函數來獲得旋轉/翻譯?也許[estimatedRigidTransform](http://opencv.willowgarage.com/documentation/cpp/structural_analysis_and_shape_descriptors.html)? – Hammer

回答

4

最好用於光流的方法是使用卡爾曼濾波器來預測運動,因此您可以在該方向投影色塊並減少下一幀的搜索區域。提高計算速度。

壞消息是要正確製作卡爾曼濾波器是一項艱鉅的任務。

2

我會提倡使用Lucas Kanade方法,因爲它速度很快。或者你可以使用類似於Lucas Kanade的RLOF的GPU實現。不要估計密集運動矢量場只是估計網格的運動矢量(例如,每個第5個像素),這可以爲您節省大量運行時間。或者對要移動的矩形進行跟蹤。爲了移動你的矩形,估計變換矩陣會更加優雅。通過cv :: getPerspectiveTransform或cv :: getAffineTransform進行仿射或透視。仿射變換包含平移,旋轉和縮放,並且透視也包含圖像。 (通過這兩個RANSAC是一個很好的估計器)。通過矩陣運算可以方便地計算出矩形點的新位置。

[X,Y,1] =矩陣* [x_old,y_old,1],見OpenCV的文檔