基于OpenCV的数字图像处理 课件 项目六 应用视频处理技术_第1页
基于OpenCV的数字图像处理 课件 项目六 应用视频处理技术_第2页
基于OpenCV的数字图像处理 课件 项目六 应用视频处理技术_第3页
基于OpenCV的数字图像处理 课件 项目六 应用视频处理技术_第4页
基于OpenCV的数字图像处理 课件 项目六 应用视频处理技术_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

VideoCapture类VideoCapture类介绍

创建VideoCapture对象释放资源捕获视频帧03设置和获取视频属性020104OpenCV的cv2.VideoCapture类是用于捕获和处理视频的核心,它不仅可以获取摄像头的实时视频流,还可以读取存储在磁盘或其它存储介质上的视频文件。

cv2.VideoCapture

的使用步骤如下:创

建VideoCapture对象创建对象后打开cap=cv2.VideoCapture()cap.open('video_or_camera_index')cap是创建一个空的VideoCapture对象,然后使用open()方法来指定视频源,'video_or_camera_index'可以是视频文件的路径,也可以是摄像头的索引号,但必须确保在读取视频文件路径或摄像头索引正确。后续可以使用isOpened()方法来检查VideoCapture对象是否成功打开。03从摄像头获取视频cap=cv2.VideoCapture(camera_index)camera_index是摄像头的索引号,一般使用0表示默认摄像头。如果有多个摄像头,“0”则表示第一个摄像头,“1”表示第二个摄像头,以此类推,可以通过增加索引号来选择不同的摄像头。02从文件读取视频

cap=cv2.VideoCapture('video')'video'是视频文件的路径。01根据使用场景不同,常见有三种主要方式创建

VideoCapture

对象:设置和获取视频属性VideoCapture提供了set()和get()方法来设置和获取视频流的属性,如帧宽度、高度、帧率等。设置视频属性的语句格式如下:

ret=cap.set(propid,value)

ret为返回值,False表示属性设置失败;

propid对应VideoCapture类对象的属性,或者改属性的值。

value对应propid需要设置的新值。

获取视频流属性的语法格式如下:

width=cap.get(cv2.CAP_PROP_FRAME_WIDTH)

cv2.CAP_PROP_FRAME_WIDTH表示要获取的是视频流的宽度

width返回值,表示获取VideoCapture对象视频流的帧宽度。

设置和获取视频属性propid属性名称含义类型备注0CAP_PROP_POS_MSEC视频文件的当前位置,以毫秒为单位Double只读属性1CAP_PROP_POS_FRAMES视频文件的当前帧编号(从0开始)Double只读属性2CAP_PROP_POS_AVI_RATIO视频文件的当前位置,以0到1之间的比率表示Double只读属性3CAP_PROP_FRAME_WIDTH视频流的帧宽度Double可读可写4CAP_PROP_FRAME_HEIGHT视频流的帧高度Double可读可写5CAP_PROP_FPS视频流的帧率(每秒帧数)Double只读属性6CAP_PROP_FOURCC视频流的编码格式,以四字符代码表示Int只读属性7CAP_PROP_FRAME_COUNT视频文件中的总帧数Int只读属性8CAP_PROP_FORMAT视频流的格式Int只读属性9CAP_PROP_MODE视频流的捕获模式Int可读可写10CAP_PROP_BRIGHTNESS视频流的亮度Double可读可写11CAP_PROP_CONTRAST视频流的对比度Double可读可写12CAP_PROP_SATURATION视频流的饱和度Double可读可写13CAP_PROP_HUE视频流的色调Double可读可写14CAP_PROP_GAIN视频流的增益Double可读可写15CAP_PROP_EXPOSURE视频流的曝光Double可读可写表6.1视频流的属性及其含义属性可以使用其对应的propid值代替,例如:获取当前帧对象的高度cv2.CAP_PROP_FRAME_HEIGHT可用语句:width=cap.get(4)捕获视频帧VideoCapture对象创建并设置好后,就可以使用read()方法来读取视频流,语法格式如下:

ret,frame=cap.read()

ret是一个布尔值,表示是否成功读取帧。

frame是捕获到的帧本身,如果未捕获到图像帧,则frame为None值。释放资源视频捕获处理完成后,通过调用release()方法释放VideoCapture对象占用的资源,释放资源函数为release(),语法格式如下:

cap.release()读取视频文件案例importcv2video_path='video//climb.mp4'#替换为你的视频文件路径cap=cv2.VideoCapture(video_path)#创建VideoCapture对象并读取视频文件ifnotcap.isOpened():#检查视频是否成功打开print("Error:Couldnotopenvideo.")exit()cap.set(cv2.CAP_PROP_FRAME_WIDTH,240)#设置宽度为340cap.set(cv2.CAP_PROP_FRAME_HEIGHT,340)#设置高度为540#获取设置后的宽度和高度(用于验证)width=cap.get(cv2.CAP_PROP_FRAME_WIDTH)height=cap.get(cv2.CAP_PROP_FRAME_HEIGHT)print(f"Setvideowidth:{int(width)},height:{int(height)}")【例】读取climb.mp4视频文件并显示。读取视频文件案例whileTrue:#循环读取视频的每一帧ret,frame=cap.read()#读取一帧ifnotret:#如果正确读取帧,ret为True,否则,说明读取到最后一帧或者帧有问题print("Reachedendofthevideoorcannotreadtheframe.")breakcv2.imshow('Frame',frame)#显示帧ifcv2.waitKey(1)&0xFF==ord('q'):#按q键退出breakcap.release()#释放VideoCapture对象cv2.destroyAllWindows()#关闭所有OpenCV窗口读取视频文件案例结果解析

代码设置了视频流的宽度和高度分别是340、540,但是获取的结果是width:720,height:1280,原因是视频文件的分辨率是固定的,无法动态改变。设置宽度和高度更多是用于摄像头捕获时调整分辨率。

运行后单击视频右上角的关闭按钮无法关闭,因为代码中写了需要按q键才能退出,因此需要将输入法切换到英文状态,然后按q键才能退出。读取摄像头视频案例importcv2cap=cv2.VideoCapture(0)#打开默认摄像头(索引为0)ifnotcap.isOpened():#检查摄像头是否成功打开print("Error:Couldnotopencamera.")exit()cap.set(cv2.CAP_PROP_FRAME_WIDTH,840)#设置宽度为840cap.set(cv2.CAP_PROP_FRAME_HEIGHT,640)#设置高度为640#获取设置后的宽度和高度(用于验证)width=cap.get(cv2.CAP_PROP_FRAME_WIDTH)height=cap.get(cv2.CAP_PROP_FRAME_HEIGHT)【例】从默认摄像头读取视频,并设置大小为width:840,height:640.读取摄像头视频案例print(f"Setcamerawidth:{int(width)},height:{int(height)}")whileTrue:#循环读取摄像头的每一帧ret,frame=cap.read()#读取一帧ifnotret:#如果正确读取帧,ret为Trueprint("Cannotreadframefromcamera.")breakcv2.imshow('Camera',frame)#显示帧ifcv2.waitKey(1)&0xFF==ord('q'):#按下'q'键退出循环breakcap.release()#释放VideoCapture对象cv2.destroyAllWindows()读取摄像头视频案例结果解析

运行代码的电脑需要装有摄像头,运行代码后可以看到摄像头实时录取的图像,调整视频流大小,可以看到调整大小后运行结果的视频流窗口大小会发生变化。谢谢!VideoWriter类VideoWriter类介绍OpenCV的cv2.VideoWrite类是用于将图像序列保存为视频文件,也可以通过修改cv2.VideoCapture

捕获的视频流属性,完成视频类型的转换。

创建VideoWrite对象

通过利用cv2.VideoWrite类的构造方法,来创建VideoWrite对象。格式如下:VideoWriter(constString&filename,intfourcc,doublefps,constSize&frameSize,boolisColor=true)

filename:输出视频文件的名称。

fourcc:用于压缩帧的编解码器的4字符代码。可以通过cv2.VideoWriter_fourcc()来指定视频编码格式,例如cv2.VideoWriter.fourcc('X','V','I','D')表示XVID编码器,v2.VideoWriter.fourcc('M','J','P','G')表示MJPG编码类型。不同的操作系统和编解码器库支持不同的fourcc代码。因此,在使用cv2.VideoWriter时,需要根据系统和需求选择合适的fourcc代码。如苹果(OSX)支持JPG(.mp4),DIVX(.avi),X264(.mkv),Windows支持DIVX等。

fps:创建的视频流的帧率(每秒帧数),表示每秒所出现的帧数。

frameSize:视频帧的大小(宽度和高度)。

isColor(可选):布尔值,默认为True,表示视频是彩色的;如果为False,则表示视频是灰度的。需要注意,如需存储灰度图像时,须保证图像帧也是灰度形式的。创建VideoWrite对象

该构造方法允许用户指定文件名、编码器、帧率、帧大小以及其他编码参数。还可以根据不同的需求和平台选择适合的视频编码器和参数来创建视频文件。例如,下面两行语句完成cv2.VideoWrite类对象的创建:fourcc=cv2.VideoWriter.fourcc('X','V','I','D')#指定视频编码格式out=cv2.VideoWriter('output.avi',fourcc,20,(1024,768))#创建cv2.VideoWriter类对象写入视频帧cv2.VideoWriter类的write方法用于将帧写入视频文件。它负责将图像数据实际编码并保存到视频文件中。语法格式如下:

ret=VideoWriter.write(frame)

frame:要写入视频的单帧图像,通常是一个NumPy数组。

ret:返回值为布尔类型,表示图像帧是否成功写入视频文件。False表示图像帧写入失败,可能是因为

VideoWriter

对象没有正确初始化,或者视频文件无法写入。写入视频帧write方法接受一个图像帧作为参数,并将其添加到内部的帧缓冲区中。如果当前图像帧为视频的第一个帧,VideoWriter会初始化视频文件并设置视频流的参数(如帧率、分辨率和编码器)。随后的调用会继续将帧添加到视频文件中,直到VideoWriter对象被释放。该方法会根据VideoWriter对象的配置(如帧率)自动处理帧的编码和写入。如果提供的图像帧的尺寸与VideoWriter对象初始化时指定的尺寸不一致,write方法可能会失败,返回False。

释放资源在不需要VideoWriter对象时,通过调用release()方法释放VideoWriter对象占用的资源,语法如下:

out.release()

读取视频文件并保存案例importcv2input_video='video//climb.mp4'#输入视频文件路径output_video='video//girl_climb.mp4'#输出视频文件路径cap=cv2.VideoCapture(input_video)#创建VideoCapture对象ifnotcap.isOpened():#检查视频是否成功打开print("Error:Couldnotopeninputvideo.")exit()#获取原始视频的属性frame_width=int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))#获取宽度frame_height=int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))#获取高度fps=cap.get(cv2.CAP_PROP_FPS)#获取帧率【例】读取一个视频文件climb.mp4,并将视频文件命名为girl_climb.mp4。读取视频文件并保存案例#定义VideoWriter对象fourcc=cv2.VideoWriter_fourcc(*'mp4v')#使用MP4编码格式out=cv2.VideoWriter(output_video,fourcc,fps,(frame_width,frame_height))whileTrue:#循环读取原始视频的每一帧ret,frame=cap.read()ifnotret:print("Reachedendofthevideoorcannotreadtheframe.")breakout.write(frame)#写入帧到新的视频文件#释放资源cap.release()out.release()print(f"Videohasbeensuccessfullysavedas{output_video}")结果解析

该程序读取原始视频后,获取原始视频的宽度、高度、帧速率等参数,作为新视频的参数,然后将原视频保存为girl_climb.mp4,代码运行后,将在指定文件夹中看到新生成的视频文件,可以点击尝试是否能正常播放。读取视频文件并保存案例读取摄像头视频并保存importcv2cap=cv2.VideoCapture(0)#打开默认摄像头(索引为0)ifnotcap.isOpened():#检查摄像头是否成功打开print("Error:Couldnotopencamera.")exit()#获取摄像头的帧大小frame_width=int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))frame_height=int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))fps=cap.get(cv2.CAP_PROP_FPS)#获取摄像头的帧率#定义VideoWriter对象fourcc=cv2.VideoWriter_fourcc(*'mp4v')#使用MP4编码格式output_video='video//capture_camera.mp4'#输出视频文件路径out=cv2.VideoWriter(output_video,fourcc,fps,(frame_width,frame_height))【例】从摄像头获取视频文件并保存为capture_camara.mp4。读取摄像头视频并保存print(f"Recordingstarted.Press'q'tostop.")whileTrue:#循环读取摄像头的每一帧ret,frame=cap.read()ifnotret:print("Cannotreadframefromcamera.")breakout.write(frame)#写入帧到视频文件cv2.imshow('Camera',frame)

#按下'q'键停止录制ifcv2.waitKey(1)&0xFF==ord('q'):breakcap.release()out.release()cv2.destroyAllWindows()读取摄像头视频并保存结果解析

运行后从指定路径查找生成的视频文件,改变out=cv2.VideoWriter(output_video,fourcc,fps,(frame_width,frame_height))中的参数

(frame_width,frame_height)的值,然后查看保存的视频大小是否发生变化。谢谢!视频处理技术技能目标视频读取和显示。能够使用cv2.VideoCapture从视频文件或摄像头中读取视频帧。能够处理和显示视频帧,例如调整帧大小、转换颜色空间等。视频写入。能够使用cv2.VideoWriter将处理后的视频帧写入视频文件。能够设置视频的编码参数,如帧率、分辨率和编码器。视频处理。能够对视频帧进行基本处理,如滤波、边缘检测、颜色变换等。能够实现简单的视频特效,如慢动作、倒放等。项目背景视频处理技术概述

视频处理技术是指对视频信号进行采集、编辑、存储、传输和播放等一系列操作的技术。该技术通过算法和软件,对视频的画面、音频、色彩等元素进行优化和调整,以达到提升视频质量、丰富视频内容的目的。在远程医疗领域,这一技术的应用使得专家能够跨越地域限制,为患者提供及时、高效的医疗服务。视频处理技术的应用场景视频处理技术的应用场景在智能交通系统中,视频处理技术则为自动驾驶汽车提供了精准的环境感知能力,从而做出正确的驾驶决策。视频处理技术的应用场景

视频作为全球通用的语言,承载着传播文化与价值观的使命。通过高质量的视频内容,国家的文化软实力得以增强,国际形象更加鲜明。视频处理技术的应用场景在教育领域,视频处理技术打破了传统教育资源的地域限制,使得优质教育资源得以广泛传播,有效缩小了教育差距,为更多人提供了平等的学习机会。项目任务项目任务

作为一名视频处理项目设计师,接到一个引人入胜的挑战:将一个展示杯子摔碎的视频进行倒放处理,生成一个杯子复原的视频。任务准备视频信号的构成

视频信号本质上是由连续的多幅图像组合而成。当一系列图像以足够快的速度依次显示时,由于人眼的视觉暂留效应,无法快速分辨每一幅单独的图像,就会将它们视为一个连续的动态场景,这就是视频信号呈现动态效果的原理。帧的定义与获取

帧是以固定时间间隔从视频中获取的。通常用帧速率表示获取(播放)帧的速度,单位为“帧/秒”(FPS,FramesPerSecond),表示在1秒内所出现帧的数量。帧的获取帧是构成视频信号的单幅图像,一系列这样的图像按顺序排列就形成了视频。帧的定义帧速率的影响较低的帧速率可能导致视频画面出现卡顿、闪烁,影响观看体验;而较高的帧速率能呈现更细腻、真实的画面。对视频播放效果的影响高帧速率会增加视频的数据量,需要更大的存储空间和更高的传输带宽;低帧速率则相反。对数据量的影响一般来说,帧速率越高,视频的流畅度越好。例如,电影常用24FPS,而游戏为追求极致流畅,常采用60FPS甚至更高。对视频流畅度的影响OpenCV库的功能特点它封装了丰富的视频处理工具包,可对视频进行帧提取、帧速率调整等操作。OpenCV能以固定时间间隔获取帧。视频处理功能OpenCV包含了多种先进的计算机视觉算法,如特征提取算法SIFT、SURF等,为不同的应用场景提供了多样化的解决方案。算法丰富性OpenCV具备强大的图像处理能力,如滤波、边缘检测、图像分割等。图像处理功能010203使用OpenCV库处理视频帧的流程01提取视频帧利用OpenCV库从视频中按固定时间间隔提取独立的帧,这些帧是后续处理的基础。03应用处理方法将选定的图像处理方法应用到提取的视频帧上,对每一帧进行处理,以达到处理视频的目的。02选择处理方法根据处理目的,选择合适的图像处理方法,如要去除噪声可选择滤波,要识别物体可选择边缘检测。04合成视频处理完所有帧后,将处理后的帧重新合成为视频,完成整个视频处理流程。谢谢!任务实施任务实施

使用Python和OpenCV,编写一个程序,将一个视频文件中的每一帧按倒序排列,实现一个“时间倒流”的视频效果。原视频是一个杯子摔碎的场景,经过处理后,新生成的视频时杯子复原的过程。分析步骤(1)使用

cv2.VideoCapture

读取一个本地视频文件。(2)将视频中的所有帧存储到一个列表中。(3)将存储的帧列表倒序排列。(4)使用

cv2.VideoWriter将倒序后的帧重新写入一个新的视频文件。注意:过程中,需确保新视频的帧率、分辨率等参数与原视频一致。项目实现importcv2defreverse_video(input_path,output_path):cap=cv2.VideoCapture(input_path)

#使用cv2.VideoCapture读取视频ifnotcap.isOpened():print("Error:Couldnotopenvideo.")returnfps=cap.get(cv2.CAP_PROP_FPS)

#获取视频的帧率、分辨率等参数width=int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))height=int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))frames=[]whileTrue:

#循环存储所有帧ret,frame=cap.read()ifnotret:breakframes.append(frame)项目实现frames.reverse()

#倒序帧print(len(frames))fourcc=cv2.VideoWriter_fourcc(*'mp4v')#使用MP4编码格式out=cv2.VideoWriter(output_path,fourcc,fps,(width,height))forframeinframes:out.write(frame)cap.release()out.release()print("Reversedvideosavedto",output_path)if__name__=="__main__":input_path="video//cup.mp4"output_path="video//cup_reverse.mp4"reverse_video(input_path,output_path)实操展示谢谢!任务拓展1.读取IP摄像机视频cv2.VideoCapture

可以从IP摄像头读取数据。在OpenCV中从IP摄像头读取数据与从文件读取数据非常相似。唯一需要修改的是提供给cv2.VideoCapture构造函数的参数,指定使用本地网络中的IP摄像机或连接公共IP的摄像机。importcv2defconnect_to_camera(ip_address):camera_url=f"{00:8080/video}"

#构造摄像头的URLcap=cv2.VideoCapture(camera_url)ifnotcap.isOpened():print(f"无法连接到摄像头,请检查IP地址和网络连接:{ip_address}")returnprint("成功连接到摄像头,按'q'键退出。")whileTrue:ret,frame=cap.read()#读取一帧ifnotret:【例】编写程序,通过指定的IP地址连接到网络摄像头,并实时显示摄像头的视频流。程序需要能够处理常见的网络摄像头连接问题,并提供友好的错误提示。1.读取IP摄像机视频print("无法读取视频流,可能是网络问题或摄像头已断开。")breakcv2.imshow("IPCameraStream",frame)#显示视频流

#按'q'键退出ifcv2.waitKey(1)&0xFF==ord('q'):break

#释放资源并关闭窗口cap.release()cv2.destroyAllWindows()if__name__=="__main__":

#用户输入摄像头的IP地址ip_address=input("请输入摄像头的IP地址(例如:8:8080/video):")connect_to_camera(ip_address)1.读取IP摄像机视频代码解析

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论