【问题标题】:Kalman Filter not giving right results卡尔曼滤波器没有给出正确的结果
【发布时间】:2016-02-02 15:10:51
【问题描述】:

我是卡尔曼滤波器跟踪的初学者,我正在按照教程 (http://opencvexamples.blogspot.com/2014/01/kalman-filter-implementation-tracking.html) 来实现多对象跟踪。我有一个结构对象,里面有一个卡尔曼滤波器,如下所示。

 struct sAsparagus
    {
        int iId;
        int iFrameId;
        int iWidth;
        int iHeight;
        int iX;
        int iY;
        int iZ;
        cv::KalmanFilter KF;
    };

然后,我尝试初始化从 blob 检测中获得的值,如下所示。

 for (CvBlobs::const_iterator it = blobs.begin(); it !=blobs.end();++it)
    {
        sAsparagus sAsp;
        sAsp.iFrameId = iCounter;
        sAsp.iWidth = (it->second->maxx - it->second->minx);
        sAsp.iHeight = (it->second->maxy - it->second->miny);
        sAsp.iX = it->second->centroid.x;
        sAsp.iY = it->second->centroid.y;
        sAsp.KF = cv::KalmanFilter(4, 2, 0);
        sAsp.KF.transitionMatrix = *(cv::Mat_<float>(4,4)<<1,0,1,0,   0,1,0,1,   0,0,1,0,   0,0,0,1);
        sAsp.KF.statePre.at<float>(0) = sAsp.iX;
        sAsp.KF.statePre.at<float>(1) = sAsp.iY;
        sAsp.KF.statePre.at<float>(2) = 0;
        sAsp.KF.statePre.at<float>(3) = 0;
        setIdentity(sAsp.KF.measurementMatrix);
        setIdentity(sAsp.KF.processNoiseCov,  cv::Scalar::all(1e-2));
        setIdentity(sAsp.KF.measurementNoiseCov, cv::Scalar::all(10));
        setIdentity(sAsp.KF.errorCovPost, cv::Scalar::all(.1));
        vGlobal.push_back(sAsp);
    }

然后,我尝试使用如下预测和校正函数。

 for (int i =0; i<vGlobal.size(); i++)
    {
        cv::Mat_<float> measurement(2,1); measurement.setTo(cv::Scalar(0));
        cv::Mat prediction = vGlobal[i].KF.predict();
        cv::Point pPredict(prediction.at<float>(0), prediction.at<float>(1));

        measurement(0) = vGlobal[i].iX;
        measurement(1) = vGlobal[i].iY;

        cv::Mat mEstimated = vGlobal[i].KF.correct(measurement);

        std::cout<<"Prediction values: "<<pPredict.x<<", "<<pPredict.y<<std::endl;
        cv::Point pEstimated(mEstimated.at<float>(0), mEstimated.at<float>(1));
        std::cout<<"Measurement values: "<<measurement(0)<<", "<<measurement(1)<<std::endl;
        std::cout<<"Estimated values: "<<pEstimated.x<<", "<<pEstimated.y<<std::endl;
 }

但我没有得到正确的结果。上述程序的示例输出是

  Prediction values: 0, 0
  Measurement values: 368, 511
  Estimated values: 7, 10

我认为这些结果是不正确的。我需要一个类似于测量值的值。我哪里错了?

【问题讨论】:

    标签: c++ opencv image-processing kalman-filter


    【解决方案1】:

    你应该设置statePost,而不是statePre

    sAsp.KF.statePost.at<float>(0) = sAsp.iX;
    sAsp.KF.statePost.at<float>(1) = sAsp.iY;
    sAsp.KF.statePost.at<float>(2) = 0;
    sAsp.KF.statePost.at<float>(3) = 0;
    

    没有控制矩阵,predict() 这样做:

    statePre = TransitionMatrix * statePost
    

    【讨论】:

    • 感谢您的回答。我现在得到的值等于测量值。但是当没有测量值时,我也需要有预测值。
    • 我还需要了解卡尔曼滤波器的基础知识。无论我走到哪里,它都包含很多数学。你能给我参考一下,我可以了解卡尔曼滤波器的基础知识吗?
    • 我的意思是,如果我没记错的话,预测值应该与测量值和估计值不同。不是吗?
    • 你应该按照我说的做初始化。第一个预测值将等于您的测量值,但之后不应该。如果它总是等于测量值,那么你有一个错误或者你的测量值没有改变
    • 是的,你是对的。我有一个错误。现在已修复。感谢您的贡献。
    猜你喜欢
    • 2020-04-28
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多