2017-05-23 11 views
2

OpenCVでカルマンフィルタを適用していくつかのトラックをフィルタリングしようとしています。私のために働かせるための最初のステップは、ポイント2fのベクトルからフィルターを使ってポイントを予測することでした。カルマンフィルタ - Null予測ポイント

私のコードは、次のいずれかになります。

oldTrackeables [i]を.getTrack()[J]
cv::KalmanFilter kalmanFilter(4,2,0, CV_32F); 
kalmanFilter.transitionMatrix = transitionMat; 
for(int i = 0 ; i < oldTrackeables.size() ; i++) 
    for(int j = 0 ; j < oldTrackeables[i].getTrack().size() ; j++) 
       { 
        cv::Size msmtSize(2,1); 
        cv::Mat measurementMat(msmtSize, CV_32F); 
        measurementMat.setTo(cv::Scalar(0)); 
        measurementMat.at<float>(0) = oldTrackeables[i].getTrack()[j].x; 
        measurementMat.at<float>(1) = oldTrackeables[i].getTrack()[j].y; 

        //Initialisation of the Kalman filter 
        kalmanFilter.statePre.at<float>(0) = (float) oldTrackeables[i].getTrack()[j].x; 
        kalmanFilter.statePre.at<float>(1) = (float) oldTrackeables[i].getTrack()[j].y; 
        kalmanFilter.statePre.at<float>(2) = (float) 2; 
        kalmanFilter.statePre.at<float>(3) = (float) 3; 


       cv::setIdentity(kalmanFilter.measurementMatrix); 
       cv::setIdentity(kalmanFilter.processNoiseCov, cv::Scalar::all(1e-4)); 
       cv::setIdentity(kalmanFilter.measurementNoiseCov, cv::Scalar::all(.1)); 
       cv::setIdentity(kalmanFilter.errorCovPost, cv::Scalar::all(.1)); 

       //Prediction 
       cv::Mat prediction = kalmanFilter.predict(); 

       kalmanFilter.statePre.copyTo(kalmanFilter.statePost); 
       kalmanFilter.errorCovPre.copyTo(kalmanFilter.errorCovPost); 

       cv::Point predictPt(prediction.at<float>(0), prediction.at<float>(1)); 
       cv::Point Mc = oldTrackeables[i].getMassCenter();   

       cv::circle(kalmat, predictPt, 16, cv::Scalar(0,255,0), 3, 2, 1); 


       std::cout<<"prediction : x = " << predictPt.x << " - y = " << predictPt.y <<std::endl; 
       std::cout<<"position captée : x = " << oldTrackeables[i].getTrack()[j].x << " - y = " << oldTrackeables[i].getTrack()[j].y << std::endl; 
       std::cout<<"size of frame : rows = " << frame.rows << " - width = " << frame.cols <<std::endl; 
       std::cout<<"size of kalmat : rows = " << kalmat.rows << " - width = " << kalmat.cols <<std::endl; 
       cv::imshow("kalmat", kalmat); 

ベクターからほんの一部Points2fです。

追跡は正確であるが、カルマン・フィルタは、予測のために "正しい" 値が得られない - 例えば、番組表示: 予測:X = 0 - 、Y = 0 - 位置captée:X = 138.29を - y = 161.078(原点の位置)。

私は本当に答えを探していて、それを行うためのさまざまな方法を試してきましたが、実際に私を助けてくれるものは見つかりませんでした...私が見つけたものが近くにありました:http://answers.opencv.org/question/24865/why-kalman-filter-keeps-returning-the-same-prediction/しかし、私の問題を解決するのに役立ちます...

回答の要素があれば、私が問題を理解するのに役立つでしょう、私は非常に感謝します。 ありがとうございます。

+0

Psの私が追加しようとしましたが、私は成功し、それを編集することはできません - しかし、こんにちはかかわら:) –

+0

あなた '私はloop'ためには、getTrackを持っていません。 – stark

+0

あなたの答えをありがとう - 私はそれが問題の理由だとは思わない... oldTackeablesはベクトル<ベクトル>であり、ベクトル "ベクトル"のポイント2fを勉強したい(古いTrackeables [i] .getTrack()ここ)。ループはマットの元の点をすべて表示できるので動作しますが、予測される点はまったく良くありません。 –

答えて

1

まず、ループの外側にあるすべてのinitの要素を移動していなければ、フィルタの内部状態をオーバーライドします。またstatePre

//Initialisation of the Kalman filter 
    kalmanFilter.statePost.at<float>(0) = (float) 0; 
    kalmanFilter.statePost.at<float>(1) = (float) 0; 
    kalmanFilter.statePost.at<float>(2) = (float) 2; 
    kalmanFilter.statePost.at<float>(3) = (float) 3; 

    cv::setIdentity(kalmanFilter.measurementMatrix); 
    cv::setIdentity(kalmanFilter.processNoiseCov, cv::Scalar::all(1e-4)); 
    cv::setIdentity(kalmanFilter.measurementNoiseCov,cv::Scalar::all(.1)); 
    cv::setIdentity(kalmanFilter.errorCovPost, cv::Scalar::all(.1)); 

statPostの一部を変更します。これはpredict相の内部で行われるので

kalmanFilter.statePre.copyTo(kalmanFilter.statePost);      
kalmanFilter.errorCovPre.copyTo(kalmanFilter.errorCovPost); 

を削除する必要があります。

最後に@Mozfoxによれば、correctフェーズは、指定したループコードには存在しません。 「!こんにちは」追加:

kalmanFilter.predict(measurementMat); 
+0

ありがとうございました!それはしばらくしているので、初期化をループの外側に置き、kalmanFilter.predict(Mat)を使用しました。あなたの他のアドバイスもありがとう、私はそれらを前にどこでも読んでいなかった。再度、感謝します ! –

0

私はあなたが測定の計算のための訂正段階を欠いていると思います。

関連する問題