opencv学习记录2-Kalman滤波

这篇具有很好参考价值的文章主要介绍了opencv学习记录2-Kalman滤波。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

贝叶斯滤波

1.理论

贝叶斯推断方法的关键是任何推断都必须且只须根据后验分布,而不能再涉及样本分布

opencv 卡尔曼滤波,opencv,python,计算机视觉,Powered by 金山文档
opencv 卡尔曼滤波,opencv,python,计算机视觉,Powered by 金山文档

2.贝叶斯滤波的基本方法:

opencv 卡尔曼滤波,opencv,python,计算机视觉,Powered by 金山文档

优缺点:

  • 优点:可以有效滤除噪声,得到比较精准的状态估计

  • 缺点:需要做无穷积分,大多数情况下没有解析解

opencv 卡尔曼滤波,opencv,python,计算机视觉,Powered by 金山文档

卡尔曼滤波是它的改进版)

opencv 卡尔曼滤波,opencv,python,计算机视觉,Powered by 金山文档
opencv 卡尔曼滤波,opencv,python,计算机视觉,Powered by 金山文档

实例

利用opencv自带的kalmanfilter类实现对鼠标轨迹的跟踪

步骤

卡尔曼滤波器算法分为两个阶段:

  1. 预测:使用由当前点计算的协方差来估计目标的新位置

  1. 更新:记录目标的位置,并为下一次循环计算修正协方差

kalman = cv2.KalmanFilter(4, 2)

表示Kalman滤波器转移矩阵维度为4,测量矩阵维度为2

(因为状态量有4个:x,y方向分别的位移和速度,可观测的量有2个:x,y方向的位移)

测量矩阵:

opencv 卡尔曼滤波,opencv,python,计算机视觉,Powered by 金山文档

转移矩阵:

opencv 卡尔曼滤波,opencv,python,计算机视觉,Powered by 金山文档

例:

kalman.measuremenMatrix = 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)

过程噪声和测量噪声以一个经验值估计(来源csdn)

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

具体操作:

  1. 初始化数组,存放测量坐标和鼠标运动预测的数据

  1. 传递进当前测量的坐标值

  1. 修正卡尔曼滤波预测结果

  1. 调用kalman类的predict,得到预测值矩阵(用来估算目标位置

  1. 将上一次测量值和当前测量值连线;将上一次预测值和当前预测值连线

注意:

  • Kalman这个类需要初始化下面变量:

转移矩阵,测量矩阵,控制向量(没有的话,就是0),过程噪声协方差矩阵,测量噪声协方差矩阵,后验错误协方差矩阵,前一状态校正后的值,当前观察值。

  • cv2.KalmanFilter(4,2)表示转移矩阵维度为4,测量矩阵维度为2

  • 卡尔曼滤波模型假设k时刻的真实状态是从(k − 1)时刻的状态演化而来,符合下式:

        X(k) = F(k) * X(k-1) + B(k)*U(k) + W(k)

其中

F(k) 是作用在xk−1上的状态变换模型(/矩阵/矢量)。

B(k) 是作用在控制器向量uk上的输入-控制模型。

W(k) 是过程噪声,并假定其符合均值为零,协方差矩阵为Qk的多元正态分布。

完整代码:文章来源地址https://www.toymoban.com/news/detail-630076.html

import cv2
import numpy as np

# 创建一个画图区域
frame = np.zeros((700, 700, 3), np.uint8) 

# 初始化测量坐标和鼠标运动预测的数组
last_measurement = current_measurement = np.array((2, 1), np.float32)
last_prediction = current_prediction = np.zeros((2, 1), np.float32)

# 用来绘制跟踪结果
def mousemove(event, x, y, s, p):
    global frame, current_measurement, measurements, last_measurement, mcurrent_prediction, last_prediction
    # 把当前预测存储为上一次预测
    last_prediction = current_prediction 
    # 把当前测量存储为上一次测量
    last_measurement = current_measurement

   
    current_measurement = np.array([[np.float32(x)], [np.float32(y)]]) 
    # 用当前测量来校正卡尔曼滤波器
    kalman.correct(current_measurement) 
    # 计算卡尔曼预测值,作为当前预测
    current_prediction = kalman.predict() 

    # 上一次测量坐标
    lmx, lmy = last_measurement[0], last_measurement[1] 
    # 当前测量坐标
    cmx, cmy = current_measurement[0], current_measurement[1] 
    # 上一次预测坐标
    lpx, lpy = last_prediction[0], last_prediction[1] 
    # 当前预测坐标
    cpx, cpy = current_prediction[0], current_prediction[1] 

    # 绘制从上一次测量到当前测量以及从上一次预测到当前预测的两条线
    # 蓝色为测量值
    cv2.line(frame, (int(lmx), int(lmy)), (int(cmx), int(cmy)), (255, 0, 0)) 
    # 粉色为预测值
    cv2.line(frame, (int(lpx), int(lpy)), (int(cpx), int(cpy)), (255, 0, 255)) 

cv2.namedWindow("kalman_tracker")
cv2.setMouseCallback("kalman_tracker", mousemove)

# 4:状态数,包括(x,y,dx,dy)坐标及速度(每次移动的距离);2:观测量,能看到的是坐标值
kalman = cv2.KalmanFilter(4, 2)
# 系统测量矩阵
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.03

while True:
    cv2.imshow("kalman_tracker", frame)
    key = cv2.waitKey(1) & 0xFF
    if key == ord('q'):
        break
cv2.destroyAllWindows()

到了这里,关于opencv学习记录2-Kalman滤波的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 卡尔曼滤波学习笔记

    从直观上来看,卡尔曼滤波是把两个存在误差的结果 融合 在一起,得到一个从数学上可以得到证明的 最优估计值 。 而这两个存在误差的结果,一个是从理论上推导出来的,称之为 先验估计值 ;一个是用传感器测量出来的,称之为 测量值 。它们之所以存在误差,是因为前

    2024年02月11日
    浏览(44)
  • 卡尔曼滤波的Python实现

    为了在Python编程环境下实现卡尔曼滤波算法,特编写此程序 主要用到了以下3个模块 numpy(数学计算) pandas(读取数据) matplotlib(画图展示) 代码的核心是实现了一个Kf_Params类,该类定义了卡尔曼滤波算法的相关参数 然后是实现了一个kf_init()函数,用来初始化卡尔曼滤波算

    2024年02月12日
    浏览(43)
  • 在Matlab/Simulink搭建卡尔曼kalman模块化模型

           Kalman滤波是一种利用线性系统状态方程,通过系统输入输出观测数据,对系统状态进行最优估计的算法。算法优点在于计算量小,能够利用前一时刻的状态或可能的测量值来得到当前时刻下状态的最优估计。观测数据中包括系统中的噪声和干扰的影响,所以最优估计

    2024年02月08日
    浏览(48)
  • 【简历完善】- SLAM - 第一篇:卡尔曼滤波的学习

    场景:晚上你需要从自己的卧室去上厕所,你知道家里的布局,了解自己的步长,但是没有灯。你如何才能走到厕所呢? “预测” = “估计”。下面所说的预测和估计就是一回事。不同博客里面这两个词语大概意思也是一致的。 比如,你摸黑走了10步,你“估计”你“大概”

    2024年02月14日
    浏览(33)
  • 快速上手的Python版二维卡尔曼滤波解析

    卡尔曼滤波是最好的线性滤波,但是需要推导的公式教多,也很细,这里推荐一个B站博主视频讲解的关于卡尔曼滤波,讲的很好,很细,适合小白学习,链接地址为:添加链接描述。如果完全没接触过卡尔曼滤波的,建议从第一集开始学习。 下面是我跟着这位博主学习后,

    2023年04月16日
    浏览(39)
  • 卡尔曼滤波简介 —— 一维卡尔曼滤波

            在本章中,我们将在一个维度上推导出卡尔曼滤波。本章的主要目标是简单直观地解释卡尔曼滤波的概念,而不使用可能看起来复杂和令人困惑的数学工具。         我们将逐步推进卡尔曼滤波方程。         在本章中,我们推导出没有过程噪声的卡尔曼

    2024年02月09日
    浏览(42)
  • 基于卡尔曼滤波的信号处理以及图像追踪Python实现

    这篇文章将由浅入深,从最简单的信号处理开始,到计算机视觉图像跟踪的应用。该文章使用Python语言,在进行视觉处理时,并未使用opencv自带的api,而是从矩阵运算进行逐步处理,更易于理解。 网上现在能看到的原理解释都很详细,这里就不多介绍。本人理解卡尔曼滤波的

    2024年02月05日
    浏览(56)
  • 【状态估计】卡尔曼滤波器、扩展卡尔曼滤波器、双卡尔曼滤波器和平方根卡尔曼滤波器研究(Matlab代码实现)

    💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 本文包括

    2024年02月08日
    浏览(48)
  • 卡尔曼滤波(KF)和扩展卡尔曼滤波(EKF)相应推导

    从上个世纪卡尔曼滤波理论被提出,卡尔曼滤波在控制论与信息论的连接上做出了卓越的贡献。为了得出准确的下一时刻状态真值,我们常常使用卡尔曼滤波、扩展卡尔曼滤波、无迹卡尔曼滤波、粒子滤波等等方法,这些方法在姿态解算、轨迹规划等方面有着很多用途。卡尔

    2024年02月03日
    浏览(66)
  • 基于卡尔曼滤波的视频跟踪,基于卡尔曼滤波的运动小球跟踪

    完整代码和数据下载链接:基于卡尔曼滤波的视频跟踪,基于卡尔曼滤波的运动小球跟踪(代码完整,数据齐全)资源-CSDN文库 https://download.csdn.net/download/abc991835105/88738577 卡尔曼滤波原理 RBF的定义 RBF理论 易错及常见问题 RBF应用实例,基于rbf的空调功率预测 代码 结果分析

    2024年02月02日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包