【1】引言
上一次课学习了用opencv读取图像,掌握了三个函数:cv.imread()、cv.imshow()、cv.imwrite()
相关链接如下:
这次课我们继续,来学习用opencv读取视频。
【2】学习资源
首先是官网资源,查看下述代码:
OpenCV: Getting Started with Videos
然后是对应的中文版博客资源,查看下述链接:
2. GUI 功能 - 视频入门 - 《OpenCV 中文文档 4.0.0》 - 书栈网 · BookStack
这两个内容基本上是一模一样,所以按照自己的喜好选用即可。
这次课程的学习目的是掌握视频的读取和保存,涉及两个函数:
cv.VideoCapture(),cv.VideoWriter()
【3】函数解读
【3.1】cv.VideoCapture()函数
点击下述链接,直达官网解读页面:
https://docs.opencv.org/4.0.0/d8/dfe/classcv_1_1VideoCapture.html
这里的核心意思也很简单:Class for video capturing from video files, image sequences or cameras.
简而言之就是:从视频文件、系列图片或者照相机中读取视频。
【3.2】cv.VideoWrite()函数
点击下述链接,直达官网解读页面:
OpenCV: cv::VideoWriter Class Reference
核心意思:Video writer class.
简而言之就是:保存视频。
【4】 代码解读
在上述解读的基础上,我们尝试理解代码。
书栈网2. GUI 功能 - 视频入门 - 《OpenCV 中文文档 4.0.0》 - 书栈网 · BookStack提供了非常简洁的代码,我们对其解读:
python"> import numpy as npimport cv2 as cvcap = cv.VideoCapture(0)while(True):# 一帧一帧捕捉ret, frame = cap.read()# 我们对帧的操作在这里gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)# 显示返回的每帧cv.imshow('frame',gray)if cv.waitKey(1) & 0xFF == ord('q'):break# 当所有事完成,释放 VideoCapture 对象cap.release()cv.destroyAllWindows()
首先是引入计算和opencv模块:
import numpy as np #引入计算模块 import cv2 as cv #引入opencv模块
然后直接调用cv.VideoCapture()函数读取视频:
cap = cv.VideoCapture(0) #读取视频
之后给了一个自定义函数,这个函数逐帧读取视频,然后把视频变成灰色输出,里面使用了imshow()函数支持输出:
while (True): #自定义函数# 一帧一帧捕捉ret, frame = cap.read()# 我们对帧的操作在这里gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY) #将每一帧都换成灰色# 显示返回的每帧cv.imshow('frame', gray) #输出灰色的视频if cv.waitKey(1) & 0xFF == ord('q'):break
然后任务完成释放所有对象:
# 当所有事完成,释放 VideoCapture 对象 cap.release() #读取完成后,释放,也就是任务完成后休息 cv.destroyAllWindows() #关闭窗口
实际上运行上述代码没有任何输出,甚至还会保存,因为至少没有视频支持读取。
所以为了完成对代码的理解,还有必要稍加改写。
上次课已经知晓,要被读取的对象最好和python程序放在一起,所以我做了一个视频,和程序放在了同一个位置,视频链接为:
dnlp-aixmls
然后把代码修改为:
python">import numpy as np #引入计算模块
import cv2 as cv #引入opencv模块cap = cv.VideoCapture('dnlp-aixmls.mp4') #读取视频
while (True): #自定义函数# 一帧一帧捕捉ret, frame = cap.read()# 我们对帧的操作在这里gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY) #将每一帧都换成灰色# 显示返回的每帧cv.imshow('frame', gray) #输出灰色的视频if cv.waitKey(1) & 0xFF == ord('q'):break
# 当所有事完成,释放 VideoCapture 对象
cap.release() #读取完成后,释放,也就是任务完成后休息
cv.destroyAllWindows() #关闭窗口
视频按照灰色的模样进行了输出,效果为:
【5】 灰度视频保存
根前述内容,已知使据用cv.VideoWrite()函数可以保存视频。
先引入一个翻转视频后再将其保存的示例,示例依然来自:2. GUI 功能 - 视频入门 - 《OpenCV 中文文档 4.0.0》 - 书栈网 · BookStack
python">import numpy as np #引入计算模块
import cv2 as cv #引入opencv模块cap = cv.VideoCapture(0) #读取视频
# 声明编码器和创建 VideoWrite 对象
fourcc = cv.VideoWriter_fourcc(*'XVID') #指定视频解码器,XVID只是其中一种方法
out = cv.VideoWriter('output.avi', fourcc, 20.0, (640, 480)) #输出视频
while (cap.isOpened()): #自定义函数ret, frame = cap.read()if ret == True:frame = cv.flip(frame, 0) #对图像进行翻转,调用了flip()函数# 写入已经翻转好的帧out.write(frame) #保存视频cv.imshow('frame', frame) #输出视频if cv.waitKey(1) & 0xFF == ord('q'):breakelse:break
# 释放已经完成的工作
cap.release()
out.release()
cv.destroyAllWindows()
上面先给出了加了注释的官网示例代码,然后我们很直观的会发现保存视频主要增加了两行汇总要代码:
fourcc = cv.VideoWriter_fourcc(*'XVID') #指定视频解码器,XVID只是其中一种方法 out = cv.VideoWriter('output.avi', fourcc, 20.0, (640, 480)) #输出视频
fourcc用于视频解码,out用于视频保存。
逻辑上也非常简单,先知道了视频的格式,也就是掌握了该如何处理的方法,然后按照期待的方向将其格式和名称进行转化就可以。
不过官网代码还不能直接使用,所以我们稍微修改一下,转化为下述形式:
python">import numpy as np #引入计算模块
import cv2 as cv #引入opencv模块cap = cv.VideoCapture('dnlp-aixmls.mp4') #读取视频
# 声明编码器和创建 VideoWrite 对象
fourcc = cv.VideoWriter_fourcc(*'XVID') #指定视频解码器,XVID只是其中一种方法
out = cv.VideoWriter('output-100.mp4', fourcc, 20.0, (1920, 1040)) #输出视频
while (cap.isOpened()): #自定义函数ret, frame = cap.read()if ret == True:frame = cv.flip(frame, 0) #对图像进行翻转,调用了flip()函数# 写入已经翻转好的帧out.write(frame) #保存视频cv.imshow('frame', frame) #输出视频if cv.waitKey(1) & 0xFF == ord('q'):breakelse:break
# 释放已经完成的工作
cap.release()
out.release()
cv.destroyAllWindows()
实际上我们看到这是一个彩色的翻转视频,链接如下。
结合一下对前面的灰度视频转化的操作,我们尝试保存一下灰度视频。
首先输入下述代码:
python">import numpy as np #引入计算模块
import cv2 as cv #引入opencv模块cap = cv.VideoCapture('dnlp-aixmls.mp4') #读取视频
# 声明编码器和创建 VideoWrite 对象
fourcc = cv.VideoWriter_fourcc(*'XVID') #指定视频解码器,XVID只是其中一种方法
out = cv.VideoWriter('output-flip-gray.mp4', fourcc, 20.0, (1920, 1040),False) #输出视频
while (cap.isOpened()): #自定义函数ret, frame = cap.read()if ret == True:frame = cv.flip(frame, 0) #对图像进行翻转,调用了flip()函数gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)# 写入已经翻转好的帧out.write(gray) #保存视频cv.imshow('gray', gray) #输出视频if cv.waitKey(1) & 0xFF == ord('q'):breakelse:break
# 释放已经完成的工作
cap.release()
out.release()
cv.destroyAllWindows()
这里和之前纯翻转代码的区别是:
【a】cv.VideoWrite()函数后增加了False,正是False参数的出现实现了灰度视频保存;
【b】out.write()和cv.imshow()的参数是gray,它们和False参数一起,保证了保存灰度视频。
【c】修改out.write()和cv.imshow()的参数gray为frame,代码不可以运行。
在v.VideoWrite()函数的官网OpenCV: cv::VideoWriter Class Reference,可以看到解释:
图1
时间也会发现这是一个小细节,只有在cv.VideoWrite()函数后增加了False参数,灰度视频才会被成功保存。
图2
保存后的翻转灰度视频为:
【6】 总结
初步学习了使用cv.VideoCapture()函数和cv.VideoWrite()函数处理视频的基本技巧。