🥭Python卡尔曼滤波器OpenCV跟踪和预测物体的轨迹
Last updated
Last updated
Python | OpenCV | Matplotlib | Numpy | 卡尔曼滤波器 | 对象跟踪和检测 | 视频流 | 二维对象 | 矩阵计算
想象一下你正坐在一辆汽车里,在雾中行驶。 你几乎看不到路,但你有一个 GPS 系统可以告诉你你的速度和位置。 问题是,这个 GPS 并不完美; 它有时会产生噪音或不准确的读数。 您如何知道您的实际位置以及行驶速度?
卡尔曼滤波器提供了答案。它结合了:
系统(您的汽车)根据其模型预测什么(称为预测步骤)。
它接收到的噪声测量结果(在这个类比中是 GPS 读数)产生的估计值在统计上比预测或测量本身更可靠。
卡尔曼滤波器主要有两个步骤:
预测:
x′P′=Ax+Bu=APk−1AT+Q
x′ 是预测状态。
A是状态转换模型。
B是控制输入模型。
u是控制向量。
P′是预测估计协方差。
Q是过程噪声协方差。
更新:
y是残值
z是测量值
H是观测模型
S是协方差
R是测量噪声协方差
K是卡尔曼增益
x是是更新后的状态估计
P是是更新后的估计协方差
安装OpenCV和Matplotlib。
OpenCV 提供了一个方便的 KalmanFilter 类,让我们可以实现卡尔曼滤波器,而不必陷入数学细节的困境。 在本演示中,我们将模拟对象的简单 2D 运动并使用卡尔曼滤波器来估计其位置。
让我们首先初始化 2D 运动的卡尔曼滤波器。
# Initialize the Kalman filter
kalman_2d = cv2.KalmanFilter(4, 2)
kalman_2d.measurementMatrix = np.array([[1, 0, 0, 0], [0, 1, 0, 0]], np.float32)
kalman_2d.transitionMatrix = np.array([[1, 0, 1, 0], [0, 1, 0, 1], [0, 0, 1, 0], [0, 0, 0, 1]], np.float32)
kalman_2d.processNoiseCov = np.array([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]], np.float32) * 1e-4
代码释义:
measurementMatrix 将状态与测量联系起来。在我们的例子中,我们只测量位置,而不测量速度.。
TransitionMatrix 表示状态转换模型。为简单起见,我们假设速度恒定。
processNoiseCov 代表与我们的流程相关的噪声。
我们将模拟一个沿直线移动的物体,并在其测量中添加一些噪声。当物体移动时,我们将应用卡尔曼滤波器来估计其真实位置。
我们有 200 个预测状态,每个状态都用一个矩阵表示。
我们还有 200 个噪声测量,每个都由一个2*1 矩阵表示。
让我们可视化对象的真实路径、噪声测量值以及卡尔曼滤波器估计的路径。
fig, ax = plt.subplots(figsize=(10, 6))
ax.set_xlim(0, 4 * np.pi)
ax.set_ylim(-1.5, 1.5)
ax.set_title("Kalman Filter in 2D Motion Estimation")
ax.set_xlabel("X Position")
ax.set_ylabel("Y Position")
# Plotting the true path, noisy measurements, and Kalman filter estimations
ax.plot(true_path[:, 0], true_path[:, 1], 'g-', label="True Path")
ax.scatter(np.array(measurements)[:, 0], np.array(measurements)[:, 1], c='red', s=20, label="Noisy Measurements")
ax.plot(np.array(predictions)[:, 0, 0], np.array(predictions)[:, 1, 0], 'b-', label="Kalman Filter Estimation")
ax.legend()
plt.show()
代码释义:
True Path:这是对象所采取的实际路径(尽管我们在现实场景中没有这个路径)。
Noisy Measurements:这些是我们从传感器获得的读数,这些读数被噪声破坏了。
Kalman Filter Estimations:这些是卡尔曼滤波器估计的位置,理想情况下应该接近真实路径。
这是我们模拟的 2D 运动的可视化:
ySKxP=z−Hx=HP′HT+R=P′HTS−1=x′+Ky=(I−KH)P′
我们系统的状态由 4x1 矩阵表示:[x,y,x˙,y˙] ,其中 x 和 y 是二维坐标,并且 x˙ 和 y˙ 分别表示 x 和 y 方向的速度。