2015-10-14 117 views
3

我正在研究使用背景減法檢測感興趣對象的項目,並使用OpenCV C++中的光流跟蹤它們。我能夠使用背景扣除來檢測感興趣的對象。我能夠在單獨的程序中實現OpenCV Lucas Kanade光流。但是,我堅持如何在一個程序中使用這兩個程序。 frame1保存來自視頻的實際幀,contours2是從前景對象中選擇的輪廓。總之,如何將從背景減法方法獲得的forground對象輸入calcOpticalFlowPyrLK?或者,如果我的方法是錯誤的,請幫助我。先謝謝你。在OpenCV C++中用於跟蹤對象的背景減法和光流

Mat mask = Mat::zeros(fore.rows, fore.cols, CV_8UC1); 
    drawContours(mask, contours2, -1, Scalar(255), 4, CV_FILLED); 

    if (first_frame) 
    { 
     goodFeaturesToTrack(mask, features_next, 1000, 0.01, 10, noArray(), 3, false, 0.04); 
     fm0 = mask.clone(); 
     features_prev = features_next; 
     first_frame = false; 
    } 
    else 
    {   
     features_next.clear(); 
     if (!features_prev.empty()) 
     { 
      calcOpticalFlowPyrLK(fm0, mask, features_prev, features_next, featuresFound, err, winSize, 3, termcrit, 0, 0.001); 
      for (int i = 0; i < features_prev.size(); i++) 
       line(frame1, features_prev[i], features_next[i], CV_RGB(0, 0, 255), 1, 8); 
      imshow("final optical", frame1); 
      waitKey(1); 
     } 
     goodFeaturesToTrack(mask, features_next, 1000, 0.01, 10, noArray(), 3, false, 0.04); 
     features_prev = features_next; 
     fm0 = mask.clone();   
    } 

回答

1

您使用光流跟蹤的方法是錯誤的。光流方法背後的想法是,在兩個連續圖像中的移動點在起點和終點處具有相同的像素強度。這意味着通過從開始圖像觀察其外觀並在最終圖像中搜索結構(非常簡化)來估計特徵的運動。

calcOpticalFlowPyrLK是一個點跟蹤器,這意味着以前的圖像中的點跟蹤到當前的一個。因此,這些方法需要系統的原始灰度值圖像。因爲它只能估計結構/紋理區域上的運動(在圖像中需要x和y梯度)。

我覺得你的代碼應該做somethink這樣的:通過背景減法(由輪廓)

  1. 提取物,這是在文獻中稱爲Blob下一圖像
  2. 提取對象和應用blob- assoziation(它屬於誰)這也叫做blob-tracken 可以用calcOpticalFlowPyrLK做一個blob跟蹤。例如。以一種非常簡單的方式:
  3. 從countd或blob內的點開始的跟蹤點。
  4. Assoziation:前一個輪廓是當前點的軌跡之一,屬於前一個輪廓的點位於當前的計數
1

我覺得OpenCV背景減法的輸出不是灰度圖像。對於輸入光流,我們需要灰度圖像。