我正在构建一个视觉传送系统,用于计算与项目工作相似的小型对象。 物体检测很流畅。但我在跟踪部分遇到了问题。
背景
代码工作流程
如果我拍摄连续视频@ 30FPS,每个物体(质心)的准确距离为52像素/帧。
在离线模式下(处理保存的视频),我可以通过向每个跟踪对象的next_location
添加52像素来预测centroid.x
。
但是,当我上线时,由于处理时间的原因,帧速率降至15-20 FPS。
所以对象的next_location
从80到200像素/帧不等。
现在我必须动态预测next_location
,因此我选择卡尔曼滤波器。
问题陈述:
我的问题是将卡尔曼矩阵配置为我的“恒速,单向”系统模型。 (由于振动,y轴的变化非常小,最大为0到5像素。)
物体的速度没有误差,但不规则 帧捕获事件会导致预测错误 next_location。
我经历了许多教程,如Student Dave,Kalman filter for dummies等。在每个教程中,我都能清楚地了解卡尔曼滤波器可以做什么,稍微了解它如何通过状态方程进行预测,但矩阵填充部分对我来说似乎非常复杂。
在某些实现代码中,如ball tracker,mouse pointer tracker或multi-bug tracker,我可以看到所有矩阵都已填充,但我不知道哪个矩阵要更改为哪个元素以适应我的要求。
MATLAB documentation of Kalman filter明确提供了恒定速度和恒定加速度运动模型的矩阵,this MATLAB code在离线模式下正确地预测了我的对象。
stateTransitionModel= [1 1 0 0 ; 0 1 0 0 ; 0 0 1 1 ; 0 0 0 1];
measurementModel = [1 0 0 0 ; 0 0 1 0];
state=[centroid(1);0;centroid(2);0];
stateCovariance=[20 0 0 0; 0 5 0 0; 0 0 20 0; 0 0 0 5];
processNoise= [100 0 0 0; 0 25 0 0; 0 0 100 0; 0 0 0 25];
measurementNoise= [100 0; 0 100]
但是当我在OpenCV-C ++中使用相同的6个矩阵时,卡尔曼滤波器甚至没有预测单个next_loc
。它只是指出了每个质心的先前位置。
如果有人可以解释矩阵的方式,那将会非常有用 和矩阵元素影响系统建模,并通过什么 配置应该用于“恒速, 我提到的单向“输送机设置,错误 是由相机的不同帧速率引起的。
我所有问题的清单:
如何在openCV中配置恒速模型的stateTransition和测量矩阵?
帧速率引起的误差应该建模为过程噪声还是测量噪声?以及如何为它们分配适当的矩阵值?
我的初始stateCovariance应该是什么?
很抱歉问了太多问题。我真的试图自己找到答案,但我有限的数学知识无法弥合理论和代码之间的差距。