首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >opencv卡尔曼滤波多目标跟踪误差

opencv卡尔曼滤波多目标跟踪误差
EN

Stack Overflow用户
提问于 2016-01-28 17:59:24
回答 1查看 2.1K关注 0票数 1

我一直在尝试用卡尔曼滤波进行多目标跟踪。这是我的密码

代码语言:javascript
复制
for (int i =0; i<vGlobal.size(); i++) // Vector of objects of interest
    {
        cv::Point pTemp = cv::Point(vGlobal[i].iX, vGlobal[i].iY);
        cv::KalmanFilter kTempKF(4,2,0);
        kTempKF.statePre.at<floatt>(0) = pTemp.x;
        kTempKF.statePre.at<float>(1) = pTemp.y;
        kTempKF.statePre.at<float>(2) = 0;
        kTempKF.statePre.at<float>(3) = 0;

        kTempKF.transitionMatrix = *(cv::Mat_<float>(4,4)<< 1,0,1,0,  0,1,0,1,  0,0,1,0,  0,0,0,1);
        cv::setIdentity(kTempKF.measurementMatrix);
        cv::setIdentity(kTempKF.processNoiseCov, cv::Scalar::all(1e-4));            
        cv::setIdentity(kTempKF.measurementNoiseCov, cv::Scalar::all(10));
        cv::setIdentity(kTempKF.errorCovPost, cv::Scalar::all(.1));
        vKalmanFilters.push_back(kTempKF);  
    }

我使用卡尔曼滤波器的向量来跟踪我的每一个对象。我已经完成了上述过滤器的初始化。现在,我试着按照下面的代码进行预测和测量。

代码语言:javascript
复制
 for (int i=0; i<vKalmanFilters.size();i++)
    {
        cv::Mat mPrediction = vKalmanFilters[i].predict(); 

        cv::Point pPredict(mPrediction.at<float>(0), mPrediction.at<float>(1));
        mMeasurement(0) = vGlobal[i].iX;
        mMeasurement(1) = vGlobal[i].iY;


        cv::Mat mEstimated;


            mEstimated = vKalmanFilters[i].correct(mPrediction); // Run time Error occurs here


     }

当我试图运行这个程序时,我得到一个正确的运行时错误(预测)。

代码语言:javascript
复制
  OpenCV Error: Assertion failed (C.type() == type && (((flags&GEMM_3_T) == 0 && C.rows == d_size.height && C.cols == d_size.width) || ((flags&GEMM_3_T) != 0 && C.rows == d_size.width && C.cols == d_size.height))) in gemm, file /build/buildd/opencv-2.4.8+dfsg1/modules/core/src/matmul.cpp, line 741
 terminate called after throwing an instance of 'cv::Exception'
 what():  /build/buildd/opencv-2.4.8+dfsg1/modules/core/src/matmul.cpp:741: error: (-215) C.type() == type && (((flags&GEMM_3_T) == 0 && C.rows == d_size.height && C.cols == d_size.width) || ((flags&GEMM_3_T) != 0 && C.rows == d_size.width && C.cols == d_size.height)) in function gemm

我仍然是卡尔曼滤波的初学者。错误发生在预测点。我的方法完全错了吗?请有人解释一下我哪里出了问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-28 21:28:41

您应该在mMeasurement中使用mPrediction (2x1矩阵)而不是mPrediction (4x1矩阵)。

代码语言:javascript
复制
mEstimated = vKalmanFilters[i].correct(mMeasurement);

既然你这样做了:

代码语言:javascript
复制
cv::KalmanFilter kTempKF(4,2,0);
// 4 dynamic params <-- your state, e.g. [x y dx dy]
// 2 measurements params <-- your mMeasurement [x y]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35068682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档