Python卡尔曼滤波器OpenCV跟踪和预测物体的轨迹

模拟简单物体二维运动和预测位置

预测数学式

想象一下你正坐在一辆汽车里,在雾中行驶。 你几乎看不到路,但你有一个 GPS 系统可以告诉你你的速度和位置。 问题是,这个 GPS 并不完美; 它有时会产生噪音或不准确的读数。 您如何知道您的实际位置以及行驶速度?

卡尔曼滤波器提供了答案。它结合了:

  1. 系统(您的汽车)根据其模型预测什么(称为预测步骤)。
  2. 它接收到的噪声测量结果(在这个类比中是 GPS 读数)产生的估计值在统计上比预测或测量本身更可靠。

卡尔曼滤波器主要有两个步骤:

预测:
x ′ = A x + B u P ′ = A P k − 1 A T + Q \begin{aligned} x^{\prime} & =A x+B u \\ P^{\prime} & =A P_{k-1} A^T+Q \end{aligned} xP=Ax+Bu=APk1AT+Q

  • x ′ x^{\prime} x是预测状态。
  • A A A是状态转换模型。
  • B B B是控制输入模型。
  • u u u是控制向量。
  • P ′ P^{\prime} P是预测估计协方差。
  • Q Q Q是过程噪声协方差。

更新:
y = z − H x S = H P ′ H T + R K = P ′ H T S − 1 x = x ′ + K y P = ( I − K H ) P ′ \begin{aligned} y & =z-H x \\ S & =H P^{\prime} H^T+R \\ K & =P^{\prime} H^T S^{-1} \\ x & =x^{\prime}+K y \\ P & =(I-K H) P^{\prime} \end{aligned} ySKxP=zHx=HPHT+R=PHTS1=x+Ky=(IKH)P

  • y y y是残值
  • z z z是测量值
  • H H H是观测模型
  • S S S是协方差
  • R R R是测量噪声协方差
  • K K K是卡尔曼增益
  • x x x是是更新后的状态估计
  • P P P是是更新后的估计协方差

代码处理

安装OpenCV和Matplotlib。

使用 OpenCV 实现卡尔曼滤波器

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

代码释义:

  • 我们系统的状态由 4x1 矩阵表示: [ x , y , x ˙ , y ˙ ] [x, y, \dot{x}, \dot{y}] [x,y,x˙,y˙] ,其中 x x x y y y 是二维坐标,并且 x ˙ \dot{x} x˙ y ˙ \dot{y} y˙ 分别表示 x 和 y 方向的速度。
  • 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 运动的可视化:

预测真实物体的轨迹

跟踪视频人物

二维对象跟踪

源代码

参阅一 - 亚图跨际
参阅二 - 亚图跨际

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/216783.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

lightdb 23.4 支持pivot行转列

前言 Lightdb-x支持行转列、列转行功能: pivot支持的语法如下: pivot支持项测试 pivot测试 create table hs_pivot(name varchar(40),course varchar(100),score int); insert into hs_pivot values(‘zhangsan’,‘chinese’,90); insert into h…

香港高才通计划申请被拒了?很可能是因为这五个原因!

香港高才通计划申请被拒了?很可能是因为这五个原因! 据统计,截止今年10月31日,香港各项输入人才计划共收到超过18万宗申请,超过11万宗已被批准,已有7万人到港。其中,高才通计划一共收到约55,000…

Java基础语法之访问修饰限定符

private 表示私有的,只能在同一个包中的同一个类使用 像这样就是在同一个包中的不同类用了private修饰的变量,这是非法的,那到底该如何给a赋值呢?可以在定义时就赋值,但这样的代码就没有可操作性,所以我们…

2023年12月12日作业

头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimerEvent> #include <QTimer> #include <QTime> #include <QTextToSpeech>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : pub…

深入浅出接口测试原理及步骤

那么接口是什么&#xff1f; 软件开发&#xff0c;既要做前端&#xff0c;也要做后端&#xff0c;并且后端是整个业务的核心&#xff0c;用于处理业务请求&#xff0c;实现具体的功能&#xff1b;而前端只是提供一个页面给用户看结果以及提供页面给用户做输入。所以整个业务的…

章鱼网络进展月报 | 2023.11.1-11.30

章鱼网络大事摘要 1、2023年12月&#xff0c;Octopus 2.0 将会正式启动。 2、隐私协议 Secret Network 宣布使用 Octopus Network 构建的 NEAR-IBC 连接 NEAR 生态。 3、Louis 受邀作为嘉宾&#xff0c;在 NEARCON2023 的多链网络主题沙龙中发言&#xff1a;我们依然处于区…

【教学类-06-14】20231212 (4*13格版)X-Y之间“加法减法+-题”正方形纸手工纸打印

效果展示——15*15CM手工纸 背景需求&#xff1a; 大3班里做“加减法”题&#xff0c;要求是最少做一张习题纸&#xff08;数字火车、加减法、分合题&#xff09;&#xff0c;然后就选手工纸玩。 做完自选的X-Y加减法题目后&#xff0c;大三班一位男孩把纸给我看&#xff1a;…

二、SpringFramework 介绍

2.1 Spring 和 SpringFramework概念 https://spring.io/projects 广义的 Spring&#xff1a;Spring 技术栈&#xff08;全家桶&#xff09; 广义上的 Spring 泛指以 Spring Framework 为基础的 Spring 技术栈。 经过十多年的发展&#xff0c;Spring 已经不再是一个单纯的应…

产品经理必备-----Axure元件使用及案列

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《产品经理管理项目周期及【Axure RP9】简介&安装&基本使用》 ⛺️ 越努力 &#xff0c;越幸运 目录 一、Axure简介 二、Axure基本元件 2.1基本元件的使用 2.1.1 、形状元件 2.…

如何将Word中的表格图片转换为可编辑格式?

我们都知道&#xff0c;Word中的表格是一个非常有用的工具&#xff0c;可以让我们在文档中轻松添加和编辑各种数据。但有时候我们可能会遇到一个问题&#xff1a;当表格作为图片插入时&#xff0c;我们就不能直接编辑它了。这可怎么办呢&#xff1f; 别担心&#xff0c;我们有…

基于以太坊的智能合约开发Solidity(数组提升篇)

参考教程&#xff1a;【数据存储篇】1、string内存原理——特殊动态数组_哔哩哔哩_bilibili 1、语法——字符串&#xff1a; //声明版本号&#xff08;程序中的版本号要和编译器版本号一致&#xff09; pragma solidity ^0.5.17; //合约 contract DynamicString {string name…

【算法】递归、搜索与回溯算法

文章目录 一. 名词解释1. 递归1.1 什么是递归&#xff1f;1.2 为什么会用到递归&#xff1f;1.3 如何理解递归&#xff1f;1.4 如何写好一个递归&#xff1f; 2. 遍历和搜索3. 回溯和剪枝 二. 递归系列专题1. 汉诺塔问题2. 合并两个有序链表3. 反转链表4. 两两交换链表中的节点…

3DSEE:AI驱动的3D模型语义搜索引擎

3DSEE &#xff08;3D SEmantic Engine&#xff09;是基于 AI 技术的 3D 模型语义搜索引擎&#xff0c;可以自动提取 3D 模型内涵的语义信息并存储入库&#xff0c;以帮助用户使用自然语言或关键字高效地检索 3D 模型。3DSEE 提供完善的二次开发 API&#xff0c;无论使用Java、…

大数据技术6:大数据技术栈

前言&#xff1a;大数据相关的技术名词特别多&#xff0c;这些技术栈之间的关系是什么&#xff0c;对初学者来说很难找到抓手。我一开始从后端转大数据的时候有点懵逼&#xff0c;整体接触了一遍之后才把大数据技术栈给弄明白了。 一、大数据技术栈 做大数据开发&#xff0c;无…

linux课程第二课------命令的简单的介绍2

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

如何用idm下载迅雷 2024最新详细解析

有许多小伙伴日常习惯用迅雷处理或者下载文件&#xff0c;对于普通用户&#xff0c;由于迅雷平台的限速&#xff0c;下载速度仅有几十kb。此外&#xff0c;还有一些小伙伴安装idm后软件界面是英文&#xff0c;那么如何用idm下载迅雷&#xff0c;idm怎么设置中文呢&#xff1f;今…

9:00面试,9:06就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到12月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40…

C++写文件时主动刷新磁盘文件大小

一.效果 如下图所示,test.log是我正在写入的文件。 二.实现 #include <fstream> #include <io.h> #include <iostream> #include <stdio.h>class OfSteamImmediately : public std::ofstream { public:OfSteamImmediately(){}~OfSteamImmediately()…

【项目小结】优点分析

一、 个人博客系统 一&#xff09;限制强制登录 问题&#xff1a;限制用户登录后才能进行相关操作解决&#xff1a; 1&#xff09;前端&#xff1a; ① 写一个函数用于判断登录状态&#xff0c;如果返回的状态码是200就不进行任何操作&#xff0c;否则Ajax实现页面的跳转操作…

ArkTS布局

布局 通过Row和Column容器来实现布局 通用属性 justifyContent 设置子元素在主轴方向的对齐格式 Column容器参数如下&#xff08;Row容器只是改变主轴方向&#xff0c;将每个图横过来理解即可&#xff09; alignItems 设置子元素在交叉轴方向的对齐格式 Row容器使用VerticalA…