2014-03-05 82 views
0

我試圖在視頻序列中使用光流方法跟蹤四邊形。四邊形由用戶在開始時提供。它的工作時間很短,但隨着對象的旋轉,跟蹤開始失敗。有人可以怎樣才能改善這種跟蹤?目標感興趣的是摩托車上的號碼牌,其具有順序中的旋轉和平移運動。最初的四個點(車牌四角)由用戶選擇。 我也試過使用SHIFT描述符,但我沒有得到足夠的匹配點之間的連續幀感興趣的地區。基於光流跟蹤OpenCV中的四邊形點

std::vector<cv::Point2f> feature_prev, feature_next; 
     std::vector<uchar> status_vector; 
     std::vector<float> status_error; 
     cv::TermCriteria termcrit; 
     cv::Size subPixWinSize, winSize; 

     cv::Mat prevFrame; 
     cv::Mat currFrame; 
feature_next.push_back(cv::Point2f((float)refRoi.P1().x,(float)refRoi.P1().y)); 
     feature_next.push_back(cv::Point2f((float)refRoi.P2().x,(float)refRoi.P2().y)); 
     feature_next.push_back(cv::Point2f((float)refRoi.P3().x,(float)refRoi.P3().y)); 
     feature_next.push_back(cv::Point2f((float)refRoi.P4().x,(float)refRoi.P4().y)); 


    cv::cvtColor(srcCpy, currFrame, CV_BGR2GRAY); 
      cv::equalizeHist(currFrame, currFrame); 

      // cv::Mat srcMat(srcGray.operator const IplImage *()); 
      // dst = src; 
      if(!feature_prev.empty()) 
      { 
       status_vector.clear(); 
       status_error.clear(); 
       feature_next.clear(); 
       cv::calcOpticalFlowPyrLK(prevFrame, currFrame,feature_prev,feature_next,status_vector,status_error, winSize, 5, termcrit, 0, 0.001); 
       size_t i, k; 
       for(i = k = 0; i < feature_next.size(); i++) 
       { 
        if(!status_vector[i]) 
        { 
         continue; 
        } 
        feature_next[k++] = feature_next[i]; 

        circle(srcCpy, feature_next[i], 3, cv::Scalar(0,255,0), -1, 8); 
       } 

       feature_next.resize(k); 
      } 

回答