Python OpenCV实现视频追踪

作者:sxqczzxsh 时间:2021-09-29 23:04:27 

本文实例为大家分享了Python OpenCV实现视频追踪的具体代码,供大家参考,具体内容如下

1. MeanShift

假设有一堆点集和一个圆形的小窗口。现在需要将此窗口移动到具有最高点集密度的区域,如下图:

Python OpenCV实现视频追踪

第一个窗口C1是蓝色圆圈的区域。蓝色环的中心用蓝色矩形标记并命名为 C1_o。窗口中所有点的点集形成的质心在蓝色圆形点C1_r。显然,质心和环的质心不重合。移动蓝色窗口,使质心与先前获得的质心重合。在新移动的圆环的区域内再次找到圆环包围的点集的质心,然后再次移动。通常,形心和质心不重合。继续执行上述移动过程,直到形心与质心大致重合。这样,最终的圆形窗口就会落到像素分布最大的地方,也就是图中的绿色圆圈C2。

除了用于视频跟踪之外,MeanShift算法在涉及数据和无监督学习的各种场景中都有重要的应用,例如聚类、平滑等。它是一种广泛使用的算法。

图像是信息矩阵。如何使用MeanShift算法跟踪视频中的移动物体?一般流程如下:

1)在图像上选择一个目标区域,

2)计算选中区域的直方图分布,一般是HSV颜色空间的直方图。

3)计算下一帧图像 b 的直方图分布。

4)计算图像b中与所选区域的直方图分布最相似的区域,并使用MeanShift算法将所选区域沿最相似的部分移动,直到找到最相似的区域。

5)重复3到4的过程,完成整个视频目标跟踪。

一般情况下,我们使用直方图反投影得到的图像和目标物体在第一帧的起始位置。当目标物体的运动会在直方图反投影图像中反映出来时,MeanShift算法会将窗口移动到反投影图像中灰度密度最高的区域。

假设我们有一个 100x100 的输入图像和一个 10x10 的模板图像,直方图反投影的过程是这样的:

1)从输入图像的左上角(0,0)开始,从(0,0)到(10,10)剪切一张临时图像。

2)生成临时图像的直方图。

3)将临时图像的直方图与模板图像的直方图进行比较,比较结果标记为c。

4)直方图比较结果c为结果图像中(0,0)处的像素值。

5)将输入图像的临时图像从(0,1)剪切到(10,11),对比直方图,记录结果图像。

6)重复步骤1到5,直到输入图像的右下角,形成直方图的反投影。

cv.meanShift(probImage, window, criteria)

参数:

probImage ROI区域,即目标的直方图的反向投影。

window  初始搜索窗口,就是定义ROI的rect。

criteria 确定窗口搜索停止的准则,主要有迭代次数达到设置的最大值,窗口中心的漂移值大于某个设定的限值等。

2. CamShift

MeanShift的结果有一个问题,检测窗口的大小是固定的,而狗是一个由近到远逐渐变小的过程,固定的窗口是不合适的。 所以需要根据目标的大小和角度来修正窗口的大小和角度。

CamShift(Continuously Adaptive Mean-Shift algorithm)是MeanShift算法的改进算法,可以解决这个问题。它可以随着跟踪目标大小的变化实时调整搜索窗口的大小,具有更好的跟踪效果。 Camshift 算法首先应用MeanShift。 一旦MeanShift收敛,它就会更新窗口的大小,同时计算出最佳拟合椭圆的方向,从而根据目标的位置和大小来更新搜索窗口。

例:使用MeanShift和CamShift方法获取视频中的狗,并标注。


import cv2 as cv
import numpy as np

# 获取视频
cap = cv.VideoCapture('image/DOG.wmv')

# 指定追踪目标
ret, frame = cap.read()
r, h, c, w = 197, 141, 0, 208
win = (c, r, w, h)
roi = frame[r:r + h, c:c + w]

# 计算直方图
hsv_roi = cv.cvtColor(roi, cv.COLOR_BGR2HSV)
roi_hist = cv.calcHist([hsv_roi], [0], None, [180], [0, 180])
cv.normalize(roi_hist, roi_hist, 0, 255, cv.NORM_MINMAX)

# 目标追踪
term = (cv.TERM_CRITERIA_EPS | cv.TERM_CRITERIA_COUNT, 10, 1)

# meanshift
while True:
   ret, frame = cap.read()
   if ret:
       hst = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
       dst = cv.calcBackProject([hst], [0], roi_hist, [0, 180], 1)

ret, win = cv.meanShift(dst, win, term)

x, y, w, h = win
       img2 = cv.rectangle(frame, (x, y), (x + w, y + h), 255, 2)
       cv.imshow("frame", img2)
       if cv.waitKey(60) & 0xFF == ord('q'):
           break

# camshift
while True:
   ret, frame = cap.read()
   if ret:
       hst = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
       dst = cv.calcBackProject([hst], [0], roi_hist, [0, 180], 1)

ret, track_window = cv.CamShift(dst, win, term)

# 绘制追踪结果
       pts = cv.boxPoints(ret)
       pts = np.int0(pts)
       img2 = cv.polylines(frame, [pts], True, 255, 2)
       cv.imshow("frame", img2)
       if cv.waitKey(60) & 0xFF == ord('q'):
           break

# 释放资源
cap.release()
cv.destroyAllWindows()

来源:https://blog.csdn.net/Amzmks/article/details/119855545

标签:python,OpenCV,视频追踪
0
投稿

猜你喜欢

  • python 3利用Dlib 19.7实现摄像头人脸检测特征点标定

    2022-07-31 05:54:21
  • JS出现失效的情况总结

    2023-08-24 00:44:42
  • 使用Python获取并处理IP的类型及格式方法

    2023-12-20 00:18:23
  • 利用types增强vscode中js代码提示功能详解

    2023-07-15 05:57:08
  • 详解django自定义中间件处理

    2023-09-30 08:19:12
  • Python字符串str和json格式相互转换

    2023-01-21 03:26:25
  • Oracle数据表分区的策略

    2010-07-28 12:59:00
  • PHP中round()函数对浮点数进行四舍五入的方法

    2023-11-23 21:35:24
  • 如何根据用户银行帐户余额的多少进行显式的提交或终止?

    2009-11-22 19:28:00
  • pycharm2022没有manage repositories配置镜像源的解决方法

    2022-06-27 05:30:24
  • 网站有效设计的10个原则

    2008-02-11 17:12:00
  • Elasticsearch属性单词常用解析说明

    2023-06-12 14:47:36
  • Python xlwt设置excel单元格字体及格式

    2023-03-10 06:04:39
  • 新手教程:如何设置五大类MySQL参数

    2010-03-03 16:40:00
  • Python模块的加载讲解

    2023-04-05 08:42:01
  • Python面向对象实现方法总结

    2022-03-11 08:50:41
  • PHP实现的线索二叉树及二叉树遍历方法详解

    2023-11-13 11:28:06
  • SQL临时表递归查询子信息并返回记录的代码

    2012-08-21 11:06:19
  • Django使用中间件解决前后端同源策略问题

    2022-09-05 10:33:32
  • 在SQL Server中使用SQL语句查询一个存储过程被其它所有的存储过程引用的存储过程名

    2012-07-11 16:09:40
  • asp之家 网络编程 m.aspxhome.com