Lesson5-2:OpenCV视频操作---视频追踪

这篇具有很好参考价值的文章主要介绍了Lesson5-2:OpenCV视频操作---视频追踪。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

学习目标

  • 理解meanshift的原理
  • 知道camshift算法
  • 能够使用meanshiftCamshift进行目标追踪

1.meanshift

1.1原理

m e a n s h i f t meanshift meanshift算法的原理很简单。假设你有一堆点集,还有一个小的窗口,这个窗口可能是圆形的,现在你可能要移动这个窗口到点集密度最大的区域当中。

如下图:

Lesson5-2:OpenCV视频操作---视频追踪,OpenCV,opencv,音视频,人工智能
最开始的窗口是蓝色圆环的区域,命名为 C 1 C1 C1。蓝色圆环的圆心用一个蓝色的矩形标注,命名为C1_o。

而窗口中所有点的点集构成的质心在蓝色圆形点C1_r处,显然圆环的形心和质心并不重合。所以,移动蓝色的窗口,使得形心与之前得到的质心重合。在新移动后的圆环的区域当中再次寻找圆环当中所包围点集的质心,然后再次移动,通常情况下,形心和质心是不重合的。不断执行上面的移动过程,直到形心和质心大致重合结束。 这样,最后圆形的窗口会落到像素分布最大的地方,也就是图中的绿色圈,命名为C2。

m e a n s h i f t meanshift meanshift算法除了应用在视频追踪当中,在聚类,平滑等等各种涉及到数据以及非监督学习的场合当中均有重要应用,是一个应用广泛的算法。

图像是一个矩阵信息,如何在一个视频当中使用 m e a n s h i f t meanshift meanshift算法来追踪一个运动的物体呢? 大致流程如下:

  1. 首先在图像上选定一个目标区域

  2. 计算选定区域的直方图分布,一般是HSV色彩空间的直方图。

  3. 对下一帧图像b同样计算直方图分布。

  4. 计算图像 b b b当中与选定区域直方图分布最为相似的区域,使用 m e a n s h i f t meanshift meanshift算法将选定区域沿着最为相似的部分进行移动,直到找到最相似的区域,便完成了在图像b中的目标追踪。

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

    通常情况下我们使用直方图反向投影得到的图像和第一帧目标对象的起始位置,当目标对象的移动会反映到直方图反向投影图中,meanshift 算法就把我们的窗口移动到反向投影图像中灰度密度最大的区域了。如下图所示:
    Lesson5-2:OpenCV视频操作---视频追踪,OpenCV,opencv,音视频,人工智能

直方图反向投影的流程是:

假设我们有一张100x100的输入图像,有一张10x10的模板图像,查找的过程是这样的:

  1. 从输入图像的左上角(0,0)开始,切割一块(0,0)至(10,10)的临时图像;
  2. 生成临时图像的直方图;
  3. 用临时图像的直方图和模板图像的直方图对比,对比结果记为c;
  4. 直方图对比结果c,就是结果图像(0,0)处的像素值;
  5. 切割输入图像从(0,1)至(10,11)的临时图像,对比直方图,并记录到结果图像;
  6. 重复1~5步直到输入图像的右下角,就形成了直方图的反向投影。
1.2 实现

在OpenCV中实现Meanshift的API是:

cv.meanShift(probImage, window, criteria)

参数:

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

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

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

实现Meanshift的主要流程是:

  1. 读取视频文件:cv.videoCapture()
  2. 感兴趣区域设置:获取第一帧图像,并设置目标区域,即感兴趣区域
  3. 计算直方图:计算感兴趣区域的HSV直方图,并进行归一化
  4. 目标追踪:设置窗口搜索停止条件,直方图反向投影,进行目标追踪,并在目标位置绘制矩形框。

示例:

import numpy as np
import cv2 as cv
# 1.获取图像
cap = cv.VideoCapture('DOG.wmv')

# 2.获取第一帧图像,并指定目标位置
ret,frame = cap.read()
# 2.1 目标位置(行,高,列,宽)
r,h,c,w = 197,141,0,208  
track_window = (c,r,w,h)
# 2.2 指定目标的感兴趣区域
roi = frame[r:r+h, c:c+w]

# 3. 计算直方图
# 3.1 转换色彩空间(HSV)
hsv_roi =  cv.cvtColor(roi, cv.COLOR_BGR2HSV)
# 3.2 去除低亮度的值
# mask = cv.inRange(hsv_roi, np.array((0., 60.,32.)), np.array((180.,255.,255.)))
# 3.3 计算直方图
roi_hist = cv.calcHist([hsv_roi],[0],None,[180],[0,180])
# 3.4 归一化
cv.normalize(roi_hist,roi_hist,0,255,cv.NORM_MINMAX)

# 4. 目标追踪
# 4.1 设置窗口搜索终止条件:最大迭代次数,窗口中心漂移最小值
term_crit = ( cv.TERM_CRITERIA_EPS | cv.TERM_CRITERIA_COUNT, 10, 1 )

while(True):
    # 4.2 获取每一帧图像
    ret ,frame = cap.read()
    if ret == True:
        # 4.3 计算直方图的反向投影
        hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
        dst = cv.calcBackProject([hsv],[0],roi_hist,[0,180],1)

        # 4.4 进行meanshift追踪
        ret, track_window = cv.meanShift(dst, track_window, term_crit)

        # 4.5 将追踪的位置绘制在视频上,并进行显示
        x,y,w,h = track_window
        img2 = cv.rectangle(frame, (x,y), (x+w,y+h), 255,2)
        cv.imshow('frame',img2)

        if cv.waitKey(60) & 0xFF == ord('q'):
            break        
    else:
        break
# 5. 资源释放        
cap.release()
cv.destroyAllWindows()

下面是三帧图像的跟踪结果:

Lesson5-2:OpenCV视频操作---视频追踪,OpenCV,opencv,音视频,人工智能

2 Camshift

大家认真看下上面的结果,有一个问题,就是检测的窗口的大小是固定的,而狗狗由近及远是一个逐渐变小的过程,固定的窗口是不合适的。所以我们需要根据目标的大小和角度来对窗口的大小和角度进行修正。 C a m S h i f t CamShift CamShift可以帮我们解决这个问题。

C a m S h i f t CamShift CamShift算法全称是“Continuously Adaptive Mean-Shift”(连续自适应MeanShift算法),是对MeanShift算法的改进算法,可随着跟踪目标的大小变化实时调整搜索窗口的大小,具有较好的跟踪效果。

C a m s h i f t Camshift Camshift算法首先应用 m e a n s h i f t meanshift meanshift,一旦 m e a n s h i f t meanshift meanshift收敛,它就会更新窗口的大小,还计算最佳拟合椭圆的方向,从而根据目标的位置和大小更新搜索窗口。如下图所示:
Lesson5-2:OpenCV视频操作---视频追踪,OpenCV,opencv,音视频,人工智能
Camshift在OpenCV中实现时,只需将上述的meanshift函数改为Camshift函数即可:

将Camshift中的:

 # 4.4 进行meanshift追踪
        ret, track_window = cv.meanShift(dst, track_window, term_crit)

        # 4.5 将追踪的位置绘制在视频上,并进行显示
        x,y,w,h = track_window
        img2 = cv.rectangle(frame, (x,y), (x+w,y+h), 255,2)

改为:

  #进行camshift追踪
    ret, track_window = cv.CamShift(dst, track_window, term_crit)

        # 绘制追踪结果
        pts = cv.boxPoints(ret)
        pts = np.int0(pts)
        img2 = cv.polylines(frame,[pts],True, 255,2)

3 算法总结

Meanshift和camshift算法都各有优势,自然也有劣势:

  • Meanshift算法:简单,迭代次数少,但无法解决目标的遮挡问题并且不能适应运动目标的的形状和大小变化。

  • camshift算法:可适应运动目标的大小形状的改变,具有较好的跟踪效果,但当背景色和目标颜色接近时,容易使目标的区域变大,最终有可能导致目标跟踪丢失。


总结

  1. meanshift

    原理:一个迭代的步骤,即先算出当前点的偏移均值,移动该点到其偏移均值,然后以此为新的起始点,继续移动,直到满足一定的条件结束。

    API:cv.meanshift()

    优缺点:简单,迭代次数少,但无法解决目标的遮挡问题并且不能适应运动目标的的形状和大小变化

  2. camshift

    原理:对meanshift算法的改进,首先应用meanshift,一旦meanshift收敛,它就会更新窗口的大小,还计算最佳拟合椭圆的方向,从而根据目标的位置和大小更新搜索窗口。

    API:cv.camshift()

    优缺点:可适应运动目标的大小形状的改变,具有较好的跟踪效果,但当背景色和目标颜色接近时,容易使目标的区域变大,最终有可能导致目标跟踪丢失文章来源地址https://www.toymoban.com/news/detail-694213.html

到了这里,关于Lesson5-2:OpenCV视频操作---视频追踪的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenCV实战(27)——追踪视频中的特征点

    我们已经知道可以通过一些最独特的点来分析图像,对于图像序列同样如此,其中一些特征点的运动可用于了解捕获场景的不同元素如何移动。在本节中,我们将学习如何在特征点逐帧移动时通过跟踪特征点来执行序列的时间分析。 (1) 要开始追踪运动过程,首先要做的是检

    2024年02月12日
    浏览(32)
  • Python轮廓追踪【OpenCV形态学操作】

    一些理论知识 OpenCV形态学操作理论1 OpenCV形态学操作理论2 OpenCV轮廓操作|轮廓类似详解 代码如下,可以直接运行

    2024年02月22日
    浏览(55)
  • 【音视频处理】基础框架介绍,FFmpeg、GStreamer、OpenCV、OpenGL

    大家好,欢迎来到停止重构的频道。  本期我们介绍 音视频处理的基础框架 。 包括FFmpeg、GStreamer、OpenCV、OpenGL 。 我们按这样的分类介绍 : 1、编解码处理:FFmpeg、GStreamer 2、图像分析:OpenCV 3、复杂图像生成:OpenGL 首先是编解码处理的基础框架,这类基础框架的 应用场景

    2024年02月08日
    浏览(50)
  • opencv+ffmpeg+QOpenGLWidget开发的音视频播放器demo

        本篇文档的demo包含了 1.使用OpenCV对图像进行处理,对图像进行置灰,旋转,抠图,高斯模糊,中值滤波,部分区域清除置黑,背景移除,边缘检测等操作;2.单纯使用opencv播放显示视频;3.使用opencv和openGL播放显示视频;4.在ffmpeg解码后,使用opencv显示视频,并支持对视

    2024年02月12日
    浏览(70)
  • Python|OpenCV-实现自动“追踪并检测”视频中的人脸识别(14)

    前言 本文是该专栏的第15篇,后面将持续分享OpenCV计算机视觉的干货知识,记得关注。 在本专栏之前,笔者在文章《Python|OpenCV-实现检测人脸以及性别检测(12)》中,有详细介绍通过OpenCV实现对图像中的人物人脸进行性别以及人脸检测,对此领域感兴趣的同学,可直接点击翻阅

    2024年04月14日
    浏览(42)
  • Opencv-C++笔记 (6) : opencv-图片和视频操作

    filename:需要读取图像的文件名称,包含图像地址、名称和图像文件扩展名 flags:读取图像形式的标志,如将彩色图像按照灰度图读取,默认参数是按照彩色图像格式读取,可 选参数在表2-3给出。 函数用于读取指定的图像并将其返回给一个Mat类变量,如果图像文件不存在、破

    2024年02月09日
    浏览(48)
  • openCV视频的读写操作

    在opencv当中视频的打开主要依靠一个类VideoCapture,在构造对象时,打开视频和摄像头主要区别就是初始的参数 如下列 显然我们不难看出,如果你想要打开摄像头,那么你的初始化参数就应该是0; 如果你要打开视频文件的时候,那么就应该是你当前视频的 路径+名字 用来检测

    2024年02月01日
    浏览(53)
  • OpenCV---视频操作

    没有摄像头,我们可以使用一款APP IP摄像头 cap = cv.VideoCapture(0) 0改成IP摄像头内容中的局域网IP

    2024年02月09日
    浏览(35)
  • Python Opencv实践 - 视频文件操作

    参考资料: 视频处理VideoCapture类---OpenCV-Python开发指南(38)_python opencv videocapture_李元静的博客-CSDN博客 OpenCV VideoCapture.get()参数详解 - 简书 FOURCC四字符码对照表_4fvcc_Kellybook的博客-CSDN博客

    2024年02月07日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包