2016-09-13 7 views
0

OpenCV 3.1でiOSのオプティカルフローを実装しようとしています。OpenCV goodFeaturesToTrackのステータスは0です。

次のコードのように、私は基本的なものを構築し、私はgoodFeaturesToTrackから機能ポイントを得るかが、事はない点がを追跡されていない、とstatus結果は常にゼロ(成功裏に追跡されていない)されています。

cv::Mat gray;   // current gray-level image 
cv::Mat gray_prev; 

std::vector<cv::Point2f> features; // detected features 
std::vector<cv::Point2f> newFeatures; 

std::vector<uchar> status; // status of tracked features 
std::vector<float> err; // error in tracking 
cv::TermCriteria _termcrit = cv::TermCriteria(cv::TermCriteria::COUNT|cv::TermCriteria::EPS,20,0.03); 


-(void)processImage:(cv::Mat&)image { 

    //-------------------- Optical Flow --------------------- 

    cv::cvtColor(image, gray, CV_BGR2GRAY); 

    if(gray_prev.empty()) { 
     gray.copyTo(gray_prev); 
    } 

    cv::goodFeaturesToTrack(gray, features, 20, 0.01, 10); 
    cv::calcOpticalFlowPyrLK(gray_prev, gray, features, newFeatures, status, err, cv::Size(10, 10), 3, _termcrit, 0, 0.001); 

    // draw circles for features points 
    for (int i = 0; i < features.size(); i++) { 
     circle(image, features[i], 10, cv::Scalar(250,250,250)); 
    } 

    for (int y = 0; y < status.size(); y++) { 
     NSLog(@"Status: %d", status[y]); // always zero 
    } 

    std::swap(newFeatures, features); 
    cv::swap(gray_prev, gray); 
} 
+0

品質レベルのパラメータを変更しようとしましたか? – Pierre

+0

@Pierreはい、何も変更されていません。 – user3607093

答えて

0

あなたは機能リストの最初の初期化のためではなく、すべてのサイクルにのみ

cv::goodFeaturesToTrack(gray, features, 20, 0.01, 10); 

を呼び出す必要があります。 あなたのやっていることは、すべてのサイクルで現在のフレームと一致するようにフィーチャーリストをリセットすることです。あなたは2つのフレーム間だけ変位をしたい場合は

また、あなたはステータスは0 2のケースを取得し

cv::goodFeaturesToTrack(**gray_prev**, features .... 
0

を呼び出す必要があります:

  • 機能は、画像のROI
  • 外です最小固有値では、lucas-kanadeウィンドウの勾配行列がminEigThresholdより上にあります。つまり、ウィンドウ内にテクスチャが不十分です。

しかし、私の経験では、状況フラグはかなり良い推測ですが、機能が正常に追跡されたかどうかを知る重要なフラグではありません。

を無視して、あなたのfeauturesとnewFeaturesベクターを描画してください。同じ場合は、gray_prevとグレーイメージが異なるかどうかをチェックします。

関連する問題