kalman滤波(OpenCV中的KalmanFilter类)

Kalman滤波器的简单实现 - LyleChen - 博客园
 


完整代码如下:

"""
在目标跟踪领域,Kalman滤波器是一个很常用的方法。

以在二维平面中跟踪一个物体的位置和速度为例,说明如果实现一个简单的Kalman跟踪器。

具体使用OpenCV中的KalmanFilter类来实现。

"""
import math
import cv2
from random import random
import numpy as np
import cv2
import matplotlib.pyplot as plt

# 表示Kalman滤波器转移矩阵维度为4,测量矩阵维度为2。
kalman = cv2.KalmanFilter(4,2)
# 因为状态量包括4个(分别是x、y方向的位移和速度),可观测的量有2个(分别是x、y方向的位移)。
kalman.measurementMatrix = np.array([[1,0,0,0],[0,1,0,0]],np.float32)

kalman.transitionMatrix = np.array([[1,0,1,0],[0,1,0,1],[0,0,1,0],[0,0,0,1]], np.float32)
kalman.processNoiseCov = np.array([[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]], np.float32) * 0.003
kalman.measurementNoiseCov = np.array([[1,0],[0,1]], np.float32) * 0.5

def data_generator(length=100):
    dxy = []
    xy = []
    last_xy = [0, 0]
    for i in range(length):
        x_base = 5 - 5 * math.cos(2 * i * math.pi / length)
        y_base = 50 - 50 * math.cos(2 * i * math.pi / length)
        x_noise = 1 * (random()-0.5)
        y_noise = 20 * (random()-0.5)
        dx_base = math.sin(2 * i * math.pi / length)
        dy_base = 30 * math.sin(2 * i * math.pi / length)
        dx_noise = 1 * (random()-0.5)
        dy_noise = 5 * (random()-0.5)
        cur_xy = [x_base + x_noise + dx_base + dx_noise, \
                  y_base + y_noise + dy_base + dy_noise]
        cur_dxy = [cur_xy[0]-last_xy[0], cur_xy[1]-last_xy[1]]
        xy.append(cur_xy)
        dxy.append(cur_dxy)
        last_xy = cur_xy
    return np.array(dxy, dtype=np.float32), \
           np.array(xy, dtype=np.float32)



def plot_image(inputs):
    xy, dxy, xy_pred, dxy_pred = inputs

    fig, axes = plt.subplots(2, 2)
    fig.set_size_inches(18, 9)
    axes[0, 0].plot(xy[:, 0], color='red', label='Measured')
    axes[0, 0].plot(xy_pred[:, 0], color='blue', label='Predicted')
    axes[0, 1].plot(xy[:, 1], color='red', label='Measured')
    axes[0, 1].plot(xy_pred[:, 1], color='blue', label='Predicted')
    axes[1, 0].plot(dxy[:, 0], color='red', label='Measured')
    axes[1, 0].plot(dxy_pred[:, 0], color='blue', label='Predicted')
    axes[1, 1].plot(dxy[:, 1], color='red', label='Measured')
    axes[1, 1].plot(dxy_pred[:, 1], color='blue', label='Predicted')

    axes[0, 0].set_title('Distance - X', loc='center', fontstyle='normal')
    axes[0, 1].set_title('Distance - Y', loc='center', fontstyle='normal')
    axes[1, 0].set_title('Speed - X', loc='center', fontstyle='normal')
    axes[1, 1].set_title('Speed - Y', loc='center', fontstyle='normal')
    axes[0, 0].legend()
    axes[0, 1].legend()
    axes[1, 0].legend()
    axes[1, 1].legend()
    plt.show()
    return


length = 100
dxy, xy = data_generator(length)
dxy_pred = []
xy_pred = []
for i in range(length):
    kalman.correct(xy[i])
    current_prediction = kalman.predict()
    xy_pred.append(current_prediction[:2, 0])
    dxy_pred.append(current_prediction[2:, 0])
dxy_pred = np.stack(dxy_pred, axis=0)
xy_pred = np.stack(xy_pred, axis=0)

plot_image((xy, dxy, xy_pred, dxy_pred))

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV,扩展卡尔曼滤波(Extended Kalman Filter,EKF)是一种基于卡尔曼滤波理论的变种滤波器,用于非线性系统的状态估计。扩展卡尔曼滤波与标准卡尔曼滤波的区别在于,它通过在传感器模型和状态转移模型使用一阶泰勒级数展开来近似非线性函数。这种近似可以使扩展卡尔曼滤波适用于更广泛的实际应用。 在OpenCV使用扩展卡尔曼滤波进行跟踪的步骤如下: 1. 创建扩展卡尔曼滤波器对象,使用KalmanFilter的构造函数指定状态和测量的维度。 2. 初始化状态矩阵、协方差矩阵和过程噪声协方差矩阵。 3. 在每个时间步,通过调用KalmanFilter的predict()方法来进行状态预测,根据系统的状态转移矩阵和过程噪声协方差矩阵更新状态和协方差。 4. 根据测量结果,调用KalmanFilter的correct()方法来进行状态修正,根据测量矩阵和测量噪声协方差矩阵更新状态和协方差。 扩展卡尔曼滤波在OpenCV的使用方式与标准卡尔曼滤波似,只是需要定义系统的非线性函数和测量的非线性函数,并在初始化滤波器对象时指定这些函数。 参考文献: OpenCV Documentation: Kalman Filter OpenCV Tutorials: Introduction to Kalman Filter OpenCV Tutorials: Mouse as a Paint-Brush - Using Kalman Filter<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [学习OpenCV2——卡尔曼滤波(KalmanFilter)详解](https://blog.csdn.net/GDFSG/article/details/50904811)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值