卡尔曼滤波没有给出正确的结果
Kalman Filter not giving right results
我是卡尔曼滤波器跟踪的初学者,我正在按照教程(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
我认为这些结果是不对的。我需要一个类似于测量值的值。我哪里出错了?
你应该设置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
相关文章:
- C++ OpenCV 卡尔曼滤波器构造函数错误
- 在 OpenGL 中将笛卡尔世界坐标转换为球面局部坐标
- 如何在贝尔曼福特算法中检测负循环?
- C++ 中unordered_map的有效笛卡尔积
- 谷歌测试:模板模板的笛卡尔乘积的类型列表与模板
- 使用多个输入向量中值的笛卡尔乘积调用 lambda
- 如何在C++中创建类型列表的 n 路笛卡尔积?
- 卡尔曼滤波器 - 零预测点
- OpenCV卡尔曼滤波器初始化错误
- 单个多对象卡尔曼滤波器与多个单对象卡尔曼滤波器(多个)
- OpenCV卡尔曼滤波器错误
- 卡尔曼滤波没有给出正确的结果
- opencv 卡尔曼滤波多对象跟踪错误
- 背景没有卡尔曼滤波器的减法器GMG
- 卡尔曼,最小二乘法,或
- OpenCV卡尔曼滤波器堆栈溢出
- 卡尔曼滤波器跟踪使用给定的X,Y的对象在Opencv C++
- OpenCV卡尔曼滤波器,从std::vector中删除
- 用卡尔曼滤波去噪图像
- 帮助将数学函数转换为代码:线性卡尔曼粒子群优化