python如何处理视频_OpenCV-Python系列之视频处理入门

视频处理在OpenCV中处于极为重要的地位,目标实时跟踪等各种实时图像处理算法都是以视频为基础。

从相机捕获视频

首先我们来了解一下使用电脑自带的相机来进行捕获视频。通常,我们必须使用摄像机捕获实时流。OpenCV提供了一个非常简单的界面来执行此操作。让我们从相机捕获视频(我使用笔记本电脑上的内置网络摄像头),我们需要了解几个函数:

cap = cv2.VideoCapture(0)

VideoCapture()中参数是0,表示打开笔记本的内置摄像头,参数是视频文件路径则打开视频,如cap = cv2.VideoCapture("../test.avi"),当然了,如果你外接的有其他的摄像头,那就可以选用其他的参数例如1从而调用它。

ret,frame = cap.read()

cap.read()按帧读取视频,ret,frame是获cap.read()方法的两个返回值。其中ret是布尔值,如果读取帧是正确的则返回True,如果文件读取到结尾,它的返回值就为False。frame就是每一帧的图像,是个三维矩阵,我们都知道视频是由一帧一帧的图像连续组成的,OpenCV在对图像处理时就是对每一帧的图像进行快速处理。

cv2.waitkey()

waitKey()方法本身表示等待键盘输入,参数是1,表示延时1ms切换到下一帧图像,对于视频而言;参数为0,如cv2.waitKey(0)只显示当前帧图像,相当于视频暂停,;参数过大如cv2.waitKey(1000),会因为延时过久而卡顿感觉到卡顿。

c得到的是键盘输入的ASCII码,esc键对应的ASCII码是27,即当按esc键是if条件句成立。

release()

调用release()释放摄像头,调用destroyAllWindows()关闭所有图像窗口。

现在我们首先进行代码实验,之后会进行一些说明:import numpy as np

import cv2 as cv

cap = cv.VideoCapture(0)

if not cap.isOpened():

print("Cannot open camera")

exit()

while True:

# Capture frame-by-frame

ret, frame = cap.read()

# if frame is read correctly ret is True

if not ret:

print("Can't receive frame (stream end?). Exiting ...")

break

# Our operations on the frame come here

# gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)

# Display the resulting frame

cv.imshow('frame', gray)

if cv.waitKey(1) == ord('q'):

break

# When everything done, release the capture

cap.release()

cv.destroyAllWindows()

isOpened可以确定摄像头是否被打开,如果打开则继续,如果未成功打开则自动退出。前面的时候我们已经讲过,frame所指代的,就是摄像头视频的每一帧图像,所以在显示时,我们也是显示每一帧。如果对每一帧图像都进行灰度化处理,那么所显示的视频就是灰度化视频,当然,关于灰度化现在还没有讲到,但是可以先做个小实验,我们来看代码:import numpy as np

import cv2 as cv

cap = cv.VideoCapture(0)

if not cap.isOpened():

print("Cannot open camera")

exit()

while True:

# Capture frame-by-frame

ret, frame = cap.read()

# if frame is read correctly ret is True

if not ret:

print("Can't receive frame (stream end?). Exiting ...")

break

# Our operations on the frame come here

gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)

# Display the resulting frame

cv.imshow('frame', gray)

if cv.waitKey(1) == ord('q'):

break

# When everything done, release the capture

cap.release()

cv.destroyAllWindows()

大家自己实验,体验一下效果。或许有的人已经发现了,我们的视频跟实际中好像是相反的,属于镜像效果,我们可以取消这种效果,在这里需要介绍一个函数,后面在图像增强部分也会介绍到:

cv2.flip ()

函数原型:flip(src, flipCode[, dst])

src代表输入的图像,我么你来看一下flipCode的参数表:

现在我们加入这行代码:import numpy as np

import cv2 as cv

cap = cv.VideoCapture(0)

if not cap.isOpened():

print("Cannot open camera")

exit()

while True:

# Capture frame-by-frame

ret, frame = cap.read()

frame = cv.flip(frame, 1)

# if frame is read correctly ret is True

if not ret:

print("Can't receive frame (stream end?). Exiting ...")

break

# Our operations on the frame come here

gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)

# Display the resulting frame

cv.imshow('frame', gray)

if cv.waitKey(1) == ord('q'):

break

# When everything done, release the capture

cap.release()

cv.destroyAllWindows()

再实验会发现图像已经没有那种镜像效果了。

从文件播放视频

从文件播放视频与从摄像机捕获视频相同,只是将摄像机索引更改为视频文件名。另外,在显示框架时,请使用适当的时间cv.waitKey()。如果太少,则视频将非常快,而如果太高,则视频将变得很慢(嗯,这就是显示慢动作的方式)。正常情况下25毫秒就可以了。

给出实例代码:import cv2 as cv

cap = cv.VideoCapture('test.avi')

while cap.isOpened():

ret, frame = cap.read()

# if frame is read correctly ret is True

if not ret:

print("Can't receive frame (stream end?). Exiting ...")

break

cv.imshow('frame', frame)

if cv.waitKey(25) == ord('q'):

break

cap.release()

cv.destroyAllWindows()

保存视频

当我们想要保存图像的时候,,这非常简单:只需使用cv2.imwrite()。而当我们想要保存视频的时候,需要做更多的工作。

这次我们创建一个VideoWriter对象。我们应该指定输出文件名(例如:output.avi)。然后,我们应指定FourCC代码(下一段中的详细信息)。然后应传递每秒的帧数(fps)和帧大小。最后一个是isColor标志。如果为True,则编码器需要彩色框,否则将与灰度框一起使用。

FourCC是一个4字节的代码,用于指定视频编码器以及****。可用代码列表可在fourcc.org中找到,它取决于平台。在Fedora中:DIVX,XVID,MJPG,X264,WMV1,WMV2。(最好使用XVID。MJPG可以生成大尺寸的视频。X264提供非常小的尺寸的视频)

在Windows中:DIVX(尚待测试和添加)

在OSX中:MJPG(.mp4),DIVX(.avi),X264(.mkv)。

FourCC代码作为MJPG的`cv.VideoWriter_fourcc('M','J','P','G')or cv.VideoWriter_fourcc(*'MJPG')`传递。

以下代码从摄像机捕获,在垂直方向上翻转每一帧,然后保存视频:import numpy as np

import cv2 as cv

cap = cv.VideoCapture(0)

# Define the codec and create VideoWriter object

fourcc = cv.VideoWriter_fourcc(*'XVID')

out = cv.VideoWriter('output.avi', fourcc, 20.0, (640,  480))

while cap.isOpened():

ret, frame = cap.read()

if not ret:

print("Can't receive frame (stream end?). Exiting ...")

break

frame = cv.flip(frame, 1)

# write the flipped frame

out.write(frame)

cv.imshow('frame', frame)

if cv.waitKey(1) == ord('q'):

break

# Release everything if job is finished

cap.release()

out.release()

cv.destroyAllWindows()

大家可以自己尝试演示效果。

视频处理的部分基本上就结束了,以上介绍到的将是以后学习中非常重要的基础。而事实上,OpenCV中对于视频的处理也有更多的操作,现在介绍最后一个函数:

VideoCapture.get()

由于前面我们已经指定cap = cv.VideoCapture(0),所以调用此函数只需用cap.get(),get中将传入参数,给出参数表:

共有18个参数,而至于相关的代码,请大家自己实验,可以使用print函数输出视频的详细信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/486375.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

100多年了,左右大脑的不对称性依然备受关注

来源:brainnews1,不对称的视角下的大脑偏侧化关于大脑不对称性的比较研究最早可以追溯到19世纪,但由于早期认为偏侧化为人类所独有,因此该领域的研究一度消失。这一领域在20世纪70年代重新出现,使我们了解到脑和行为的…

java-线程-生产者-消费者

概述 在Java中有四种方法支持同步,其中前三个是同步方法,一个是管道方法。 wait() / notify()方法 await() / signal()方法 BlockingQueue阻塞队列方法 PipedInputStream / PipedOutputStream wait() / notify()方法 public class Storage {private fina…

如何用python做计算软件_如何用Python写一个计算器软件 附带效果图

1 import tkinter #导入tkinter模块23 root tkinter.Tk()4 root.minsize(280,500)5 root.title(李蛟龙的计算器)678 #1.界面布局9 #显示面板10 result tkinter.StringVar()11 result.set(0) #显示面板显示结果1,用于显示默认数字012 result2 tkinter.StringVar() #…

BI之报表测试总结

报表测试总结: 1、测试准备工作: 数据准备 保证足够多的有效数据 清楚报表中涉及到的算法、公式 清楚业务功能接口 2、报表测试点 基本测试点:界面、控件、格式、布局、明显的数据错误、js报错、报表标题,报表整体风格,翻页&#…

经由因果分析,反驳AI监控学生上课,及辨别健康类谣言

来源:混沌巡洋舰想象这样一个场景,你和你心爱的女孩一起自习,你的理科好,于是你看着她听数学的网课时,有时露出困惑的表情,还有时会走神。然后等她听完,你再把你觉得她没有听懂的部分&#xff0…

python 连续三个数满足条件_计算满足条件的连续值数(Pandas Dataframe)

这是一个带有^{}-# https://stackoverflow.com/a/52718782/ Divakardef maxisland_start_len_mask(a, fillna_index -1, fillna_len 0):# a is a boolean arraypad np.zeros(a.shape[1],dtypebool)mask np.vstack((pad, a, pad))mask_step mask[1:] ! mask[:-1]idx np.fl…

java controller json_springMVC的controller层接收前端json数据

1.前端的操作:对象接收json数据方式:将所需要传的数据转化为json数据,并将这些数据以post方式传到后台的controller层,然后controller层接收json数据,并且是以对象的形式进行接收。这里面是springmvc自动控制将这些数据…

里程碑!SpaceX 载人首飞发射成功,马斯克填补美国载人飞行近十年空白

来源:雷锋网作者 | 付静1 代表着首次,标志着政府与企业持续合作前往国际空间站的开始。终于,美国太空探索技术公司(SpaceX)的首次正式载人飞行任务拉开大幕!美东时间 2020 年 11 月 15 日 19 时 27 分&…

【树状数组】CF961E Tufurama

挺巧妙的数据结构题(不过据说这是一种套路? E. Tufurama One day Polycarp decided to rewatch his absolute favourite episode of well-known TV series "Tufurama". He was pretty surprised when he got results only for season 7 episod…

取文字_把这4个字母输入word,会得到一段神秘文字,承载着一段历史

在英文的输入状态下,把“ rand()”输入word后,按下回车键,就会突然跳出一页文字把“ rand()”输入excel后,按下回车键,则会得到这样的结果,0.134582最后再把“ rand()”输入PPT,按下回车键&…

一文看懂数字孪生,工信部权威白皮书

来源:智东西11月11日消息,《由商务部、科技部、工信部、国家发改委、农业农村部、国家知识产权局、中国科学院、中国工程院等部委和深圳市人民政府共同举办的中国国际高新技术成果交易会正式开幕。作为大会主会场的重要组成部分,由工信部下属…

linux -- control service and daemon process

linux -- control service and daemon process 一、几个重要概念的讲解 1、systemd 系统启动和服务器进程由 systemd 系统和服务管理器进行管理 此程序提供一种方式,可以在启动时和运行中的系统上激活系统资源、服务器守护进程和其他进程 2、守护进程 守护进程是在执…

java 网页正文抽取算法_网页正文抽取算法 ContentExtractor

软件介绍简介ContentExtractor 是一个开源的网页正文抽取工具,用JAVA实现,具有非常高的抽取精度。算法ContentExtractor的网页正文抽取算法使用的是CEPR,适用于几乎所有的包含正文的网页。 算法简介:项目地址转移项目已和WebColle…

基于人工智能智商研究的智能定律初探

什么是智能和意识一直是智能科学领域最基础也是最具有争议的问题,2014年以来,我们在对人机通用智能发展水平的进行研究时提出了标准智能模型,统一描述人和智能机器的特征。在这个研究的基础上,2020年5月我们在《Annals of Data》发…

Postman----Presets(预先设置)的使用

使用场景: 当我们在进行接口测试post请求时,headers是必填项,我们将一个A接口的headers编写后测试完成,再次进行B接口的测试,需重新编写headers,为了简单操作,我们就用到了Presets。 Presets 作…

opengl 如何加阴影_OpenGL + Qt: 3 - 旋转动画和键盘操纵

前三篇链接:OpenGL Qt: 0 - 三角形绘制 OpenGL Qt: 1 - 用下拉框选颜色 OpenGL Qt: 2 - 走向3D,画正四面体 这一周笔者经历了漫长的洲际飞行和昏天黑地的倒时差,所以本篇内容相对少一些,侧重 Qt 而不是 OpenGL。在上一篇中&…

mybatis java类注解式_Spring整合Mybatis注解方式

Spring整合Mybatis(注解方式)环境准备jar包:Spring所需依赖:spring-context、spring-aspects、aspectjrt、aspectjweaver、spring-tx、spring-jdbcmybatis所需要:mybatis、mybatis-spring、mysql-connector-java、(druid、c3p0、HikariCP)辅助…

2020十大新兴技术揭晓!每一项都可能颠覆我们的生活

转自丨科技日报作者丨张佳欣编辑丨翟丽影全世界都在竞相研发新冠肺炎疫苗,前景令人鼓舞,我们可能会在破纪录的时间内研发出疫苗。但在未来新冠疫情仍在蔓延的情况下,技术能帮助我们更快地实现目标吗?世界经济论坛和《科学美国人》杂志本月10…

c#_导出table功能

一:第一张导出方法,简单快捷 请注意:一般表格都有真分页,查询数据时候注意把分页条件去掉#region 此处是获取的list数组 然后转table再调用ExportExcel var list"你的list数据库源"DataTable dt new DataTable();dt.…

java 协议处理器_协议处理器urlstreamhandler及contenthandler

先看段打开网页的代码:URL urlnew URL("http://souljava.blog.163.com/");URLConnection connectionurl.openConnection();connection.getInputStream();问题1:客户端浏览器怎么判断接受到的是什么数据类型?回答:java的…