卡尔曼是匈牙利数学家,Kalman滤波器源于其博士毕业了论文和1960年发表的论文《A New Approach to Linear Filtering and Prediction Problems》(线性滤波与预测问题的新方法)。
论文地址

卡尔曼滤波不要求信号和噪声都是平稳过程的假设条件。对于每个时刻的系统扰动和观测误差(即噪声),只要对它们的统计性质作某些适当的假定,通过对含有噪声的观测信号进行处理,就能在平均的意义上,求得误差为最小的真实信号的估计值。

因此,自从卡尔曼滤波理论问世以来,在通信系统、电力系统、航空航天、环境污染控制、工业控制、雷达信号处理等许多部门都得到了应用,取得了许多成功应用的成果。卡尔曼滤波器会对含有噪声的输入数据流(比如计算机视觉中的视频输入)进行递归操作,并产生底层系统状态(比如视频中的位置)在统计意义上的最优估计。


卡尔曼滤波算法分为两个阶段:
预测阶段:卡尔曼滤波器使用由当前点计算的协方差来估计目标的新位置;
更新阶段:卡尔曼滤波器记录目标的位置,并为下一次循环计算修正协方差。

整个卡尔曼滤波的过程就是个递推计算的过程,不断的“预测–更新–预测–更新……”


import cv2
import numpy as np# 创建一个空帧,定义(700, 700, 3)画图区域
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, current_prediction, last_predictionlast_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, (lmx, lmy), (cmx, cmy), (255, 0, 0)) # 蓝色线为测量值cv2.line(frame, (lpx, lpy), (cpx, cpy), (255, 0, 255)) # 粉色线为预测值# 窗口初始化
cv2.namedWindow("kalman_tracker")# opencv采用setMouseCallback函数处理鼠标事件,具体事件必须由回调(事件)函数的第一个参数来处理,该参数确定触发事件的类型(点击、移动等)
cv2.setMouseCallback("kalman_tracker", mousemove)kalman = cv2.KalmanFilter(4, 2) # 4:状态数,包括(x,y,dx,dy)坐标及速度(每次移动的距离);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) & 0xFFif key == ord('q'):break
cv2.destroyAllWindows()


一些学习资料:

  • 这篇文章对Kalman滤波做了个通俗易懂的介绍:http://www.cnblogs.com/feisky/archive/2009/11/09/1599247.html
  • 这篇博客也介绍了鼠标跟踪程序:http://blog.csdn.net/onezeros/article/details/6318944
  • 这篇博客对opencv中本身自带的Kalman例子讲解得很清楚,可以学习学习:http://blog.csdn.net/yang_xian521/article/details/7050398
  • 这篇博客对卡尔曼滤波相关公式讲的很到位http://lib.csdn.net/article/opencv/29029

(OpenCV+Python)--目标跟踪,卡尔曼滤波+鼠标轨迹跟踪相关推荐

  1. Labelme鼠标轨迹跟踪标注软件

    Labelme鼠标轨迹跟踪标注软件 Labelme标注软件优化 大家好,如果大家有用过labelme软件进行过数据标注就知道,尤其是在对比较大的多的复杂的物体进行分割或检测标注时,智能狂点鼠标,点到手 ...

  2. 在Matlab下编程实现二维与三维的航迹跟踪控制、路径跟踪控制和轨迹跟踪控制,实现编队集群控制与避障控制

    在Matlab下编程实现二维与三维的航迹跟踪控制.路径跟踪控制和轨迹跟踪控制,实现编队集群控制与避障控制. 研究对象有空中无人机.地面机器人.水面无人艇.水下机器人以及多智能体等. ID:321006 ...

  3. [转载] OpenCV—Python目标区域图像分割

    参考链接: 使用OpenCV在Python中进行图像处理 使用OpenCV截取目标区域 关于灰度图二值化:https://blog.csdn.net/sinat_21258931/article/de ...

  4. 机器视觉 OpenCV—python目标跟踪(光流)

    文章目录 一.运动检测 1.1 检测思路 1.2 代码 二.运动方向预测 2.1 关键点(角点)追踪 goodFeaturesToTrack() 2.2 光流法 一.运动检测 1.1 检测思路 目标跟 ...

  5. 【轨迹跟踪】无人机轨迹跟踪【含Matlab源码 1152期】

    ⛄一.L1导航算法简介 L1导航算法是非常经典的非线性无人机路径跟随算法,最早由MIT于2004年提出,其导航算法中是先选点,生成一段为L1的路径. 1 直线路径跟踪 L1路径跟随算法的基本思想就是在 ...

  6. 【毕业设计】深度学习卫星遥感图像检测与识别 -opencv python 目标检测

    文章目录 0 前言 1 课题背景 2 实现效果 3 Yolov5算法 4 数据处理和训练 5 最后 0 前言

  7. 基于卡尔曼滤波算法的轨迹跟踪

    目录 一.理论基础 二.核心程序 三.仿真结论 一.理论基础 卡尔曼滤波是一种用于处理具有噪声的动态系统的数学方法.它最初是为了跟踪飞机.导弹和航天器的位置和速度而开发的.卡尔曼滤波在轨迹跟踪.控制系 ...

  8. 路径与轨迹、路径规划与轨迹规划、路径跟踪与轨迹跟踪

    对于无人车辆来说,全局路径点只要包含空间位置信息即可,也可以包含姿态信息,而不需要与时间相关,但局部规划时,则可以考虑时间信息.这里规定轨迹点也是一种路径点,即当路径点信息中加入时间约束,就可以被称为 ...

  9. 自动驾驶笔记-轨迹跟踪之①纯跟踪算法(Pure Pursuit)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.阿克曼转向模型 1.1 模型理解 1.2 模型表达 二.纯跟踪算法(Pure Pursuit) 2.1 算法理解 ...

最新文章

  1. RAFT-3D: 基于刚体变换的场景流估计(ICCV 2021)
  2. Python 封装MySQL类
  3. SSIS实用教程(SQLServer2005)
  4. asp.net 2.0下嵌套masterpage页的可视化编辑
  5. [No000022]他们说:得诺贝尔奖到底有多难?
  6. java数据库插入mysql乱码
  7. 【aviator】aviator 报错 Syntax error:Unexpect token 'OR' Parsing expression
  8. 动态调整linux分区大小,GParted 动态调整Linux分区大小
  9. 让我们深入了解PP YOLO做出的贡献
  10. Silverlight/Windows8/WPF/WP7/HTML5周学习导读(8月20日-8月26日)
  11. python excel 复制行_通过python复制excel行
  12. 达叔机器学习笔记1_逻辑回归建立一般流程
  13. 华为5G手机+鸿蒙系统,还能这么玩儿?
  14. 用C语言写钢琴小程序的代码,用C语言编写钢琴小程序
  15. IT行业和互联网行业是什么关系?
  16. 趋势科技如何卸载?卸载时总提示要输入密码
  17. 电脑公司 GHOST WIN10 X64 装机专业版 V2018.04(64位)
  18. MIT线性代数:4.矩阵A的LU分解
  19. 前端应该了解的PWA
  20. 深度盘点:可视化看板20份,直接套用真爽

热门文章

  1. lua 5.3.5 TValue::tt_和GCObject::tt之间的爱恨纠葛
  2. GD32F303固件库开发(17)----内部Flash读写
  3. Docker——Dockerfile(构建自己的CentOS镜像和Tomcat镜像)并打包镜像发布上线
  4. C语言 习题3-1 比较大小 (简单解法)
  5. rtx3050显卡什么水平 rtx3050显卡相当于GTX什么级别
  6. MYSQL基本操作(增删改查)
  7. Error while building/deploying project QTtest (kit: Desktop Qt 5.9.0 MinGW 32bit)When executing~
  8. 【SVAC】国家视频编解码标准SVAC的特色和优势
  9. L1-054 福到了 (15分)题解
  10. L1-054 福到了 (15 分)