opencv卡尔曼滤波器多目标跟踪错误

Posted

技术标签:

【中文标题】opencv卡尔曼滤波器多目标跟踪错误【英文标题】:opencv Kalman filter multiple object tracking error 【发布时间】:2016-01-28 17:59:24 【问题描述】:

我一直在尝试使用卡尔曼滤波器进行多对象跟踪。这是我的代码,

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);  
    

我正在使用卡尔曼滤波器矢量来跟踪我的每个对象。如上所述,我已经完成了过滤器的初始化。现在我尝试在下面的代码中进行预测和测量。

 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


     

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

  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

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

【问题讨论】:

矩阵应该是float (CV_32F) 或double (CV_64F),而不是int @Berriel:是的,它奏效了。但是现在(如新编辑的那样),在我现在添加的正确(预测)步骤中发生了不同的运行时错误。 【参考方案1】:

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

mEstimated = vKalmanFilters[i].correct(mMeasurement);

鉴于你做了:

cv::KalmanFilter kTempKF(4,2,0);
// 4 dynamic params <-- your state, e.g. [x y dx dy]
// 2 measurements params <-- your mMeasurement [x y]

【讨论】:

那我该如何使用预测呢?我认为预测也应该给出 2x1 矩阵。有人告诉我,如果没有测量,那么预测将是解决方案。所以预测也给出了与测量类似的值。如果没有测量值,如何获得预测值?这是我的问题。 如果此答案解决了您的问题,请接受或投票。关于您的疑问,KalmanFilter 在校正步骤中使用了一个测量值,它根据该测量值更新预测状态。如果缺少测量值,则由您决定。有时,人们使用最后的预测状态来correct(),但在这样做之前,我建议你从数学上理解真正发生的事情。此外,在这种情况下,状态是 4x1,您只需要将前 2 个用作 measurement 嗨,这对我不起作用。我得到错误的估计值。但是,如果我在全局范围内声明 KalmanFilter 对象,我会得到正确的估计值,如果我只有一个 blob,我也会得到正确的估计值。如果我有两个 blob,我会在两个 blob 的中心得到两个相同的估计值。我将如何使估计值遵循它们各自的 blob?你能帮帮我吗?

以上是关于opencv卡尔曼滤波器多目标跟踪错误的主要内容,如果未能解决你的问题,请参考以下文章

多目标跟踪匈牙利 - 卡尔曼滤波算法

交互式多模型-扩展卡尔曼滤波IMM-EKF——机动目标跟踪中的应用

交互式多模型-扩展卡尔曼滤波IMM-EKF——机动目标跟踪中的应用

交互式多模型-无迹卡尔曼滤波IMM-UKF仿真一——机动目标跟踪中的应用

交互式多模型-无迹卡尔曼滤波IMM-UKF仿真一——机动目标跟踪中的应用

计算机视觉(多目标跟踪)算法中卡尔曼滤波算法详解