opencv--视频操作

OpenCV中视频操作及人脸识别案例 目录OpenCV中视频操作及人脸识别案例视频操作视频读写从文件中读取视频并播放保存视频小结视频追踪meanshiftCamshift算法总结小结案例:人脸案例人脸识别基础实现小结 OpenCV中视频操作及人脸识别案例 主要内容: 视频文件的读取和存储 视频追踪中的meanshift和camshift算法 人脸识别案例 视频操作 视频读写 学习目标 掌握读取视频文件,显示视频,保存视频文件的方法 从文件中读取视频并播放 在OpenCV中我们要获取一个视频,需要创建一个VideoCapture对象,指定 阅读详情

1 视频读写

1.1 从文件中读取视频并播放

在OpenCV中我们要获取一个视频,需要创建一个VideoCapture对象,指定你要读取的视频文件:

  1. 创建读取视频的对象
cap = cv.VideoCapture(filepath)

参数:

  • filepath: 视频文件路径
  1. 视频的属性信息
    获取视频的某些属性,retval = cap.get(propId)
    参数:
    • propId: 从0到18的数字,每个数字表示视频的属性。常用属性有:
      在这里插入图片描述
    • 修改视频的属性信息,cap.set(propId,value)
      参数:
      • proid: 属性的索引,与上面的表格相对应
      • value: 修改后的属性值
  2. 判断图像是否读取成功,isornot = cap.isOpened()
    若读取成功则返回true,否则返回False
  3. 获取视频的一帧图像,ret, frame = cap.read()
    参数:
    • ret: 若获取成功返回True,获取失败,返回False
    • Frame: 获取到的某一帧的图像
  4. 调用cv.imshow()显示图像,在显示图像时使用cv.waitkey()设置适当的持续时间,如果太低视频会播放的非常快,如果太高就会播放的非常慢,通常情况下我们设置25ms就可以了。
  5. 最后,调用cap.realease()将视频释放掉
import numpy as np
import cv2 as cv
# 1.获取视频对象
cap = cv.VideoCapture('DOG.wmv')
# 2.判断是否读取成功
while(cap.isOpened()):
    # 3.获取每一帧图像
    ret, frame = cap.read()
    # 4. 获取成功显示图像
    if ret == True:
        cv.imshow('frame',frame)
    # 5.每一帧间隔为25ms
    if cv.waitKey(25) & 0xFF == ord('q'):
        break
# 6.释放视频对象
cap.release()
cv.destoryAllwindows()

1.2 保存视频

在OpenCV中我们保存视频使用的是VedioWriter对象,在其中指定输出文件的名称,如下所示:

  1. 创建视频写入的对象,out = cv2.VideoWriter(filename,fourcc, fps, frameSize)
    参数:

    • filename:视频保存的位置
    • fourcc:指定视频编解码器的4字节代码
    • fps:帧率
    • frameSize:帧大小
  2. 设置视频的编解码器,retval = cv2.VideoWriter_fourcc( c1, c2, c3, c4 )
    参数:

    • c1,c2,c3,c4: 是视频编解码器的4字节代码,在fourcc.org中找到可用代码列表,与平台紧密相关,常用的有:在Windows中:DIVX(.avi)
      在OS中:MJPG(.mp4),DIVX(.avi),X264(.mkv)。
  3. 利用cap.read()获取视频中的每一帧图像,并使用out.write()将某一帧图像写入视频中。

  4. 使用cap.release()和out.release()释放资源。

import cv2 as cv
import numpy as np

# 1. 读取视频
cap = cv.VideoCapture("DOG.wmv")

# 2. 获取图像的属性(宽和高,),并将其转换为整数
frame_width = int(cap.get(3))
frame_height = int(cap.get(4))

# 3. 创建保存视频的对象,设置编码格式,帧率,图像的宽高等
out = cv.VideoWriter('outpy.avi',cv.VideoWriter_fourcc('M','J','P','G'), 10, (frame_width,frame_height))
while(True):
    # 4.获取视频中的每一帧图像
    ret, frame = cap.read()
    if ret == True: 
        # 5.将每一帧图像写入到输出文件中
        out.write(frame)
    else:
        break 

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

2 视频追踪

2.1 meanshift

2.1.1 meanshift原理

meanshift算法的原理很简单。假设你有一堆点集,还有一个小的窗口,这个窗口可能是圆形的,现在你可能要移动这个窗口到点集密度最大的区域当中。
在这里插入图片描述
最开始的窗口是蓝色圆环的区域,命名为C1。蓝色圆环的圆心用一个蓝色的矩形标注,命名为C1_o。
而窗口中所有点的点集构成的质心在蓝色圆形点C1_r处,显然圆环的形心和质心并不重合。所以,移动蓝色的窗口,使得形心与之前得到的质心重合。在新移动后的圆环的区域当中再次寻找圆环当中所包围点集的质心,然后再次移动,通常情况下,形心和质心是不重合的。不断执行上面的移动过程,直到形心和质心大致重合结束。 这样,最后圆形的窗口会落到像素分布最大的地方,也就是图中的绿色圈,命名为C2。

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

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

  1. 首先在图像上选定一个目标区域
  2. 计算选定区域的直方图分布,一般是HSV色彩空间的直方图。
  3. 对下一帧图像b同样计算直方图分布。
  4. 计算图像b当中与选定区域直方图分布最为相似的区域,使用meanshift算法将选定区域沿着最为相似的部分进行移动,直到找到最相似的区域,便完成了在图像b中的目标追踪。
  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步直到输入图像的右下角,就形成了直方图的反向投影。

2.1.1 meanshift实现

在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()

在这里插入图片描述

2.2 Camshift

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

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

Camshift算法首先应用meanshift,一旦meanshift收敛,它就会更新窗口的大小,还计算最佳拟合椭圆的方向,从而根据目标的位置和大小更新搜索窗口。如下图所示:
在这里插入图片描述
Camshift在OpenCV中实现时,只需将上述的meanshift函数改为Camshift函数即可:

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)

         #进行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)
       
        cv.imshow('frame',img2)

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

2.3算法总结

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

  • Meanshift算法:简单,迭代次数少,但无法解决目标的遮挡问题并且不能适应运动目标的的形状和大小变化。
  • camshift算法:可适应运动目标的大小形状的改变,具有较好的跟踪效果,但当背景色和目标颜色接近时,容易使目标的区域变大,最终有可能导致目标跟踪丢失。
OpenCV基础知识(9)— 视频处理(读取并显示摄像头视频、播放视频文件、保存视频文件等) OpenCV不仅能够处理图像,还能够处理视频。要想处理视频,需要先对视频进行读取、显示、保存等相关操作。为此,OpenCV提供了VideoCapture类和VideoWrite类的相关方法。 阅读详情

相关推荐

OpenCV实战(26)——视频序列处理

视频信号包含丰富的视觉信息,视频由一系列图像组成,每一图像称为一帧 (frame),这些图像以固定的时间间隔(通过指定帧率,单位为秒/帧)拍摄并显示运动场景。随着计算机算力的提升,现在已经可以对视频序列执行复杂的视觉分析,处理速度已经接近甚至快于实际视频帧率 (frame rate)。本节将学习如何读取、处理和存储视频序列。

盼小辉丶的博客 2万+

OpenCV基础操作_视频读取

本文介绍了利用OpenCV来读取视频文件和IPC设备,给出示例。并分享了一些在项目中,遇到的摄像头延时的分析和处理心得,供大家参考。

putiancaijunyu的专栏 1万+

OpenCV技术应用(1)— 如何去截取视频中的帧

本节课将介绍两种方法去截取视频中的帧:一种是按间隔来截取,一种是截取视频中全部的帧,刚入门OpenCV的小白必学!

小哥谈 2878

OpenCv:采集摄像头视频、读取视频帧与视频录制

OpenCv

weixin_64443786的博客 6903

opencv:读取图像和视频以及鼠标操作

opencv基本操作——入门篇。

这里是Mae。 3933

OpenCV视频操作

使用工具Python3.5, 使用库numpy;opencv 1.用摄像头捕获视频 cv2.VideoCapture() :0为默认计算机默认摄像头,1可以更换来源; import numpy as np import cv2 cap = cv2.VideoCapture(0) while(True): #capture frame-by-frame ret , frame = cap.read() #our operation on the frame come here

主攻大数据 人工智能 物联网 安全 低空经济等方向。mtsc 、gtest特邀分享嘉宾 655

【opencv2】对视频的操作

opencv2中,提供了两个视频操作相关的类,VideoCapture和VideoWriter,当然也有相对应的构造函数。 对于VideoCapture,其有如下几个操作函数: open(const string &filename)    //打开视频文件 open(int device)              //打开摄像头,device为设备序号 isOpened()   //判

autocyz 3339

手把手教你用Apollo Dreamview调试自动驾驶感知模块(附数据包下载)

本文详细介绍了如何使用百度Apollo平台的Dreamview工具调试自动驾驶感知模块,包括环境配置、数据加载、感知问题定位和多传感器融合调试等关键步骤。通过实战案例和参数调整技巧,帮助开发者快速掌握自动驾驶感知模块的调试方法,提升开发效率。

weixin_29084111的博客 140

OpenCV | 基于视频的基础操作

Opencv 基于视频的读取与保存操作

ToBeCeratinToBeTall的博客 1810

DOA估计算法从原理到仿真——CBF、Capon、MUSIC算法

从原理出发理解并实现经典的DOA估计算法

m0_55845774的博客 1万+

UVM概述及uvm_component和uvm_object(一)

UVM:Universal Verification Methodology(通用验证方法学) UVM:是建立在systemverilog平台上的一个库,提供了一系列的接口,让我们能够更方便的进行验证。验证平台组成: Driver:用来把不同的激励施加给DUT; Monitor:用来检测DUT的输出; Scoreboard:专门用来比较期望值与monitor检测到的DUT输出; Refer

南国之邱 1万+

OpenCV 视频操作

Meanshift和camshift算法都各有优势,自然也有劣势Meanshift算法简单,迭代次数少,但无法解决目标的遮挡问题并且不能适应运动目标的的形状和大小变化。camshift算法可适应运动目标的大小形状的改变,具有较好的跟踪效果,但当背景色和目标颜色接近时,容易使目标的区域变大,最终有可能导致目标跟踪丢失。httpshttpshttpshttpshttps。...

mengxianglong123的博客 3063

研究生研一学习机器学习ML、深度学习DL的规划

研究生学习机器学习DL、深度学习DL的规划 保上研之后也没有很好规划自己的学习路线,看到b站上的一位清华博士讲述他本科也是机械跨考计算机的学习路线,所以记录下来,从现在开始按照规划来一点一点地做好。 掌握python(推荐一周) 1.1 面向对象编程 廖雪峰python网站: https://www.liaoxuefeng.com 1.2 数据分析Numpy numpy 100题: https://www.yanxishe.com/columnDetail/24784 1.3数据分析pandas pan

没有最好,只有更好 3099

opencv视频操作

从摄像头读取视频内容 import numpy as np import cv2 # 从摄像头获取图像数据 cap = cv2.VideoCapture(0) while(True): # ret 读取成功True或失败False # frame读取到的图像的内容 # 读取一帧数据 ret,frame = cap.read() # 变为灰度图 gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) cv2.i.

cyj5201314的博客 141

【YOLOv12改进trick】高效多尺度卷积注意力EMCAD_Block模块引入YOLOv12,实现涨点和效率提升,含创新点Python代码

EMCAD引入YOLOv12模块,实现高效多尺度注意力模块引入到YOLOv12中的快速涨点及效率提升

向上生长的程序媛的博客 852

Python 爬虫实战:爬虫代码打包为可执行文件

本文详细介绍了使用PyInstaller工具将Python爬虫打包为可执行文件的全过程。以豆瓣电影Top250爬虫为例,首先对比了主流打包工具,推荐选择跨平台的PyInstaller。通过编写完整的爬虫代码(包含异常处理和数据保存功能),演示了从环境准备、代码测试到打包配置的具体步骤。重点讲解了单文件打包、自定义图标等高级功能,并针对常见的"找不到模块"、文件体积过大等问题提供了解决方案。文章还说明了跨平台打包的注意事项,帮助开发者实现爬虫程序的无环境依赖部署,大幅提升程序的易用性和部署

2503_91057718的博客 2216

【opencv】18、视频操作

视频的基本操作:创建对象,视频读取,对象释放,视频属性获取/设置,视频保存

weixin_37804469的博客 4194

【云原生技术】helm中Chart.yaml、values.yaml、_helpers.tpl 各自的写法与作用

Chart.yaml、values.yaml、_helpers.tpl 各自的写法与作用 在一个标准的 Helm Chart 中,通常会包含以下关键文件: - **Chart.yaml** - **values.yaml** - **templates/`_helpers.tpl`** - 以及若干模板文件(`deployment.yaml`、`service.yaml` 等) 下面分别介绍这几个文件的作用、常见字段及其含义。

weixin_46453070的博客 752

opencv python视频教程-OpenCV视频操作

使用工具Python3.5,使用库numpy;opencv1.用摄像头捕获视频cv2.VideoCapture() :0为默认计算机默认摄像头,1可以更换来源;~~~import numpy as npimport cv2cap = cv2.VideoCapture(0)while(True):#capture frame-by-frameret , frame = cap.read()#our ...

weixin_37988176的博客 395

如何在多 GPU 配置上运行 Unsloth:数据并行或模型并行

当工作负载受限于内存(模型或批次无法放入单张显卡)、或受限于计算且计算与通信比率较高时(即每块 GPU 的额外计算量超过同步参数的开销,如在 DDP 中,或超过传递激活值的开销,如在模型并行中),多 GPU 配置才开始显现优势。在松散连接的显卡上(尤其是 PCIe 版本的 H100 或 A100),额外的设备间数据传输会导致性能显著低于单 GPU 运行。让我们厘清概念,明确说明如何通过模型并行(将模型拆分到多个 GPU)或数据并行(在每个 GPU 上复制模型)来跨多 GPU 运行 Unsloth。

人工智能领域专家 647

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

OpenCV对视频的处理操作

OpenCV(C++)对视频的操作,包括 视频文件摄像头使用 视频处理与保存。

hjl011006的博客 2414

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

OpenCV视频序列操作实例

本文章代码基于《OpenCV 2 计算机视觉 编程手册》第10章 处理视频序列。同时对于书中的一些错误代码予以纠正。 由于该章内容基本自成体系,并以类封装了常用的视频读取、处理等操作,故共享于此。 #include #include #include #include #include using namespace cv; using namespace std; //帧处理的

july0404的专栏 744

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

OpenCV视频操作学习笔记

OpenCV视频操作自学学习笔记

Dy16nt的博客 519

OpenCV视频处理操作

视频处理 从文件中读取视频并播放 在OpenCV中我们要获取一个视频,需要创建一个VideoCapture对象,指定你要读取的视频文件: 创建读取视频的对象 cap = cv.VideoCapture(filepath) 参数: filepath: 视频文件路径 视频的属性信息 2.1 获取视频的某些属性: retval = cap.get(propId) 参数: propId: 从0到18的数字,每个数字表示视频的属性 常用属性有: 2.2 修改视频的属性信息 cap.set(

kuokay的博客 9264

OpenCV之视频操作

文章目录一、打开视频1.读视频2.捕获摄像头3.open()二、视频打开的例子 一、打开视频 1.读视频 VideoCapture capture("1.avi"); 2.捕获摄像头 VideoCapture capture(0); 3.open() VideoCapture capture; capture.open(0); 同 VideoCapture capture(0); 二、视频...

sandalphon4869的博客 586

Opencv视频流操作

使用 python3(2.7也可以)+opencv3.3.1实现 opencv是跨平台的计算机视觉库,不支持处理声音, 声音需要另行处理 import time import cv2 #通过cv2中的类获取视频流操作对象cap cap = cv2.VideoCapture('http://hls01open.ys7.com/openlive/026e24e6bef14c62ba2d...

weixin_42368421的博客 3112
上一篇: opencv--图像特征提取与描述
下一篇: 图像特征总结(一)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值