目录

一、Kalman

二、流程

三、代码

3.1 meanshift+kalman实现


kalman被用来描述目标的运动模型,它不对目标的特征建模,而是对目标的运动模型进行建模,常用于估计目标在下一帧的位置。

一、Kalman

在上面的跟踪中,meanshift和camshift链接。我们使用的都是Meanshift或者是基于Meanshift的Camshift来进行的跟踪,这里我们还可以对其进行改良:引入卡尔曼滤波的概念。

卡尔曼滤波的概念较为复杂,这里我们可以理解为:从一个含有噪音的输入中,得出一个具有统计意义上较为良好的估计值。

我们举个简单的例子,比如我现在有一个物体,正在以1m/s的速度(过去测量得到的值)离我远去,当前它离我1m远,因为我们知道他正在以1m/s的速度远离我,所以下一秒我就能估计出它离我2m远,这个是显然的。但是如果这个物体撞到了什么东西后,速度改变了,我们就会根据它实际位置上的值(含有噪音的模糊输入)来矫正我们的猜测。 卡尔曼滤波一般我们设置为4个参数,其中两个是可以直接得到的。举个例子,我们使用函数来创建一个卡尔曼滤波器:

klm=cv2.KalmanFilter(4,2)

这里的4表示的是有四个参数分别是(x,y,dx,dy),前两个是我们输入进去的参数,物体跟踪里面我们假定为我们跟踪物体的中心的坐标,dx和dy表示的是物体移动的速度,为观测量,不能直接得到,所以其实我们能直接输入进去的参数就只有坐标,x和y两个值,所以初始化的时候4后面跟一个2,所以就是(4,2) 然后我们需要设置卡尔曼滤波器的几个矩阵:

klm.measurementMatrix = np.array([[1,0,0,0],[0,1,0,0]],np.float32)
klm.transitionMatrix = np.array([[1,0,1,0],[0,1,0,1],[0,0,1,0],[0,0,0,1]],np.float32)
klm.processNoiseCov = np.array([[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]],np.float32)

参数:

  • measurementMatrix,测量矩阵,这里表示的是我们能直接测量得到的参数(x,y,dx,dy)中的前两位,所以只有[1,0,0,0],[0,1,0,0],来标记第一位和第二位。
  • transitionMatrix,状态转移矩阵,为[1,0,1,0],[0,1,0,1],[0,0,1,0],[0,0,0,1],表示的是(x+dx,y+dy),这里的含义其实就是算上速度后下一个时刻的估计。
  • processNoiseCov,这个是在为预测进行修正卡尔曼滤波里面几个方程中的参数,依次参考的次序为x,y,dx,dy。

二、流程

三、代码

3.1 meanshift+kalman实现

现在我们对上文优化的基础上,再加入卡尔曼滤波,我们把矩形框的中间位置作为输入,加载到卡尔曼滤波器中,预测出现在物体的位置后,以预测位置为圆心画一个圆,示例代码如下所示:

import cv2
import numpy as npdef center(points):x = (points[0][0] + points[1][0] + points[2][0] + points[3][0]) / 4y = (points[0][1] + points[1][1] + points[2][1] + points[3][1]) / 4return np.array([np.float32(x), np.float32(y)], np.float32)cap = cv2.VideoCapture('E:\Python-Code/videodataset/enn.mp4')
ret, frame = cap.read()
# 我这里画面太大了所以缩小点
# frame = cv2.resize(frame, None, None, fx=1 / 2, fy=1 / 2, interpolation=cv2.INTER_CUBIC)
# 跟踪框
track_window = cv2.selectROI('img', frame)# 获得绿色的直方图
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv, np.array((35, 43, 46)), np.array((77, 255, 255)))
hist = cv2.calcHist([hsv], [0], mask, [181], [0, 180])
cv2.normalize(hist, hist, 0, 255, cv2.NORM_MINMAX)term_crit = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1)# 设置卡尔曼滤波器
klm = cv2.KalmanFilter(4, 2)
klm.measurementMatrix = np.array([[1, 0, 0, 0], [0, 1, 0, 0]], np.float32)
klm.transitionMatrix = np.array([[1, 0, 1, 0], [0, 1, 0, 1], [0, 0, 1, 0], [0, 0, 0, 1]], np.float32)
klm.processNoiseCov = np.array([[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]], np.float32)while 1:ret, frame = cap.read()# frame = cv2.resize(frame, None, None, fx=1 / 2, fy=1 / 2, interpolation=cv2.INTER_CUBIC)if ret == True:hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)dst = cv2.calcBackProject([hsv], [0], hist, [0, 180], 1)ret, track_window = cv2.meanShift(dst, track_window, term_crit)x, y, w, h = track_window# 获得中间坐标cent = center([[x, y], [x + w, y], [x, y + h], [x + w, y + h]])# 修正参数klm.correct(cent)# 预测c = klm.predict()# 画出预测位置cv2.circle(frame, (int(c[0]), int(c[1])), 30, (255, 255, 0), -1)# 画出矩形框img = cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)(x, y) = img.shape[:2]cv2.imshow('img', img)if cv2.waitKey(1) == ord('q'):breakelse:break
cap.release()
cv2.destroyAllWindows()

传统目标跟踪——卡尔曼滤波Kalman(结合MeanShift+Kalman)相关推荐

  1. 传统目标跟踪——CamShift算法(改进MeanShift)

    目录 一.CamShift 1.1 原理 二.流程 三.代码 四.总结 一.CamShift MeanShift的结果有一个问题,检测窗口的大小是固定的,而目标是一个由近到远逐渐变小的过程,固定的窗口 ...

  2. 传统目标跟踪——MeanShift算法

    目录 一.均值漂移(MeanShift) 二.流程 三.代码 3.1 meanshift+固定框的代码 3.2 优化:meanshift+鼠标选择 3.3 meanshift+自己实现函数 四.补充知 ...

  3. 传统目标跟踪方法简介

    前言:由于个人之前做过一个目标跟踪算法,所以,有必要将之前的工作做一个梳理. 目录 基于第一种思路的运动目标检测 1. 静态背景: 2. 运动场 目标跟踪: 相似性度量算法: 核心搜索算法: 卡尔曼滤 ...

  4. 目标跟踪--卡尔曼滤波 与 匈牙利算法

    目前主流的目标跟踪算法都是基于Tracking-by-Detecton策略,即基于目标检测的结果来进行目标跟踪. 跟踪结果中,每个bbox左上角的数字是用来标识某个人的唯一ID号.那么问题就来了,视频 ...

  5. 目标跟踪之camshift---opencv中meanshift和camshift例子的应用

    在这一节中,主要讲目标跟踪的一个重要的算法Camshift,因为它是连续自使用的meanShift,所以这2个函数opencv中都有,且都很重要.为了让大家先达到一个感性认识.这节主要是看懂和运行op ...

  6. 目标跟踪算法--Camshift 和Meanshift

    算法原理: meanshift原理: meanshift算法思想其实很简单:利用概率密度的梯度爬升来寻找局部最优.它要做的就是输入一个在图像的范围,然后一直迭代(朝着重心迭代)直到满足你的要求为止.但 ...

  7. java opencv 视频教程_OpenCV视频目标跟踪示例教程(Meanshift)

    使用Opencv中的Camshift进行视频中目标跟踪是一个不错的选择,这方面的示例很多,但是大多代码不全,或者代码存在问题,不能正常使用,这里,对很多文章进行整理后,贴出了正确可以使用的代码. 安装 ...

  8. 传统目标跟踪——光流法

    目录 一.光流法 二.LK光流法 2.1 实现原理 2.2 API 三.代码 四.总结 基于特征点的光流跟踪,在目标上提取一些特征点,然后在下一帧计算这些特征点的光流匹配点,统计得到目标的位置.在跟踪 ...

  9. 传统目标跟踪——帧差法

    目录 一.帧差法 二.代码 2.1 二帧差法 2.2 三帧差法 三.总结 一.帧差法 计算帧之间的差异,或考虑"背景帧"与其他帧之间的差异. 当视频中存在移动物体的时候,相邻帧(或 ...

最新文章

  1. 三十一、CI框架之使用验证码
  2. 可覆写的函数与创建节点
  3. 使用google colab运行RNN网络代码报告错误ValueError: Object arrays cannot be loaded when allow_pickle=False
  4. 算法与数据结构(part2)--Python内置类型性能分析
  5. bucket sort sample sort 并行_双调排序Bitonic Sort,适合并行计算的排序算法
  6. 西南大学计算机与信息科学学院陈武,学院副院长——陈武 - 计算机与信息科学学院 - Powered by 西南大学...
  7. html中2d变形兼容性,CSS3(3)---2D变形(transform)
  8. python中 * 的用法
  9. Atitit 项目质量管理 目录 1. 标准化 规范化 1 1.1. 而项目管理中的39个标准过程(PMI)或42个要素(ICB)全部是一次性过程或要素, 1 1.2. 休哈特(shewhart 统
  10. windows10如何设置电脑的固定IP地址
  11. NR、EN-DC等名词解释
  12. JIRA-使用教程_界面_创建、方案配置
  13. iMX6ULL启动流程
  14. 计算机应用研究抄袭撤稿,衢州畜牧兽医高级职称评审北大核心期刊书评发表
  15. Java的运算符——取整、取绝对值、取余数、求模
  16. Caliburn.Micro将枚举 绑定到ComboBox
  17. Retrofit教程
  18. C++设计模式(1)——设计模式简介
  19. 工业物联网 凌顶发布注塑机通讯协议Euromap 63 的 OPCUA 驱动组件
  20. 电路中 电容的作用【大全】!

热门文章

  1. python空间数据处理_基于Python的空间数据批量处理方法
  2. 物研究所做一位科研人员
  3. 如何离线安装npm包
  4. 二(1-苯基-异喹啉)(乙酰丙酮)合铱(III)
  5. 2021互联网人开年平均薪资才15000!
  6. 循迹智能小车c语言主程序,智能小车循迹、避障、红外遥控C语言代码
  7. cnc加工中心保养表_CNC保养检查记录表
  8. 怎样才算是一个好的测试用例
  9. 写作业用白光还是暖白光?分享色温4000K暖白光的护眼台灯
  10. Resid------set