我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python OpenCV实现视频追踪

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python OpenCV实现视频追踪

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

1. MeanShift

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

第一个窗口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()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python OpenCV实现视频追踪

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python OpenCV实现视频追踪

本文实例为大家分享了Python OpenCV实现视频追踪的具体代码,供大家参考,具体内容如下 1. MeanShift 假设有一堆点集和一个圆形的小窗口。现在需要将此窗口移动到具有最高点集密度的区域,如下图:第一个窗口C1是蓝色圆圈的区域
2022-06-02

Python+Opencv怎么实现人脸追踪

这篇文章主要介绍“Python+Opencv怎么实现人脸追踪”,在日常操作中,相信很多人在Python+Opencv怎么实现人脸追踪问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python+Opencv怎么
2023-06-21

OpenCV基于稠密光流如何实现视频跟踪

这篇“OpenCV基于稠密光流如何实现视频跟踪”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“OpenCV基于稠密光流如何实现
2023-07-05

OpenCV怎么使用稀疏光流实现视频对象跟踪

这篇“OpenCV怎么使用稀疏光流实现视频对象跟踪”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“OpenCV怎么使用稀疏光流
2023-07-05

python+opencv处理视频

http://python.jobbole.com/85247/
2023-01-31

python+opencv实现目标跟踪

python-opencv3.0新增了一些比较有用的追踪器算法,这里根据官网示例写了一个追踪器类程序只能运行在安装有opencv3.0以上版本和对应的contrib模块的python解释器 #encoding=utf-8import cv2
2023-01-31

python+opencv实现视频抽帧示例代码

1、数据集简述: 虽然有主流庞大的COCO、VOC数据集,但是科研人员仍需要特殊领域要求的数据集,所以采用人工实地采集的方式进行收集数据集图像;通过拍照收集图像过于繁琐,所以通常是将摄像头无规则的移动旋转以及远近拉缩,进而录制
2022-06-02

怎么在python中使用opencv实现视频抽帧

怎么在python中使用opencv实现视频抽帧,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1、数据集简述: 虽然有主流庞大的COCO、VOC数据
2023-06-15

如何通过OpenCV实现对指定颜色的物体追踪

这篇文章给大家分享的是有关如何通过OpenCV实现对指定颜色的物体追踪的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。实现对特定颜色的物体追踪,我实验用的是绿萝的树叶。新建脚本ball_tracking.py,加入
2023-06-22

Python实现人脸识别并进行视频跟踪打码

这篇文章主要为大家详细介绍了如何利用Python实现人脸识别并进行视频跟踪打码效果,羞羞的画面统统打上马赛克,感兴趣的小伙伴可以了解一下
2023-03-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录