导读
OpenCV功能越发强大,不学一下怎么行?
今天要分享这篇文章带我们一起了解视频的读取操作(包括从摄像头读取和从视频中读取),视频的保存操作 。让我们走进这篇文章,一起来了解一下吧!
如果你有什么问题,或者有什么想法,欢迎评论与我一起沟通交流。如果你想了解更多有关于计算机视觉、OpenCV、机器学习、深度学习等相关技术的内容,想与更多大佬一起沟通,那就加群:326866692 或者扫描下方二维码加入我们吧!
1 视频读取
1 理论讲解
在前面,我们讲到图像的一些简单操作,包括图像的读取、显示、存储,讲到窗口的创建和删除。很多时候,我们想操作的不仅仅是图像,还有视频。
读取视频可能是从摄像头中读取,也可能是从视频中读取。
2 API介绍
视频读取的API是VideoCapture,该API实现的功能是:
通过摄像头或者文件读取视频。
API定义如下:
def VideoCapture(filename, apiPreference=None):
API的参数含义如下:
(1)filename:视频的文件名或者摄像头的索引,0表示系统默认摄像头;
(2)apiPreference:视频加载参数。一般使用默认加载。
第二个参数可取值有很多,在这里不展开说明,我们一般使用如下,也就是默认的加载方式:
CAP_ANY = 0
在读取视频时,我们要检测是否成功打开视频文件或成功开启摄像头,检测视频文件或者摄像头是否打开的API是isOpened,该API实现的功能是:
如果摄像头或视频文件打开成功,返回True,如果打开失败,返回False。
调用方式如下:
cap.isOpened()
3 代码示例
讲完理论和API,我们举几个例子。
首先是打开摄像头获取视频:
cap = cv.VideoCapture(0) # 数字表示摄像头索引,0表示从系统默认摄像头开始。
if not cap.isOpened():
print("无法打开摄像头")
exit()
然后是打开文件获取视频:
cap = cv.VideoCapture(fileName)
if not cap.isOpened():
print("无法打开视频文件")
exit()
2 视频显示与释放
1 理论讲解
视频显示是按帧显示所以我们需要用循环不断获取帧,直到所有帧获取结束或者用户退出。
我们用之前提到的waitKey来控制帧,一般来说,我们设为25帧,太大就会有卡顿现象出现。
2 API介绍
读取视频帧的API是read,该API实现的功能是:
读取视频流的每一帧,并转化为图片输出。
该API的调用方式如下:
ret, frame = cap.read()
该API有两个返回值,一个返回值用来表示是否正确读取帧,一个返回值用来保存检测到的每一帧图片:
(1)ret用来表示是否正确读取帧,取值为 True 或 False ;
(2)frame用来保存正确读取帧后的每一帧图片。
在视频显示中,还用到一个功能,是视频显示过程中按下某个字符时,退出视频:
if cv.waitKey(1) == ord('q'): # 按下q退出
break
当退出视频时,我们要将定义的视频变量释放掉,我们用到下面的语句:
cap.release()
3 代码示例
我们读取视频后,需要按帧显示视频,当显示完毕,或者检测的退出字符,就退出视频:
while True:
# 逐帧捕获
ret, frame = cap.read() # 如果正确读取帧,ret为True
if not ret:
print("无法正确读取帧")
break
# 按帧显示
cv.imshow('frame', frame)
if cv.waitKey(25) == ord('q'):
break
# 完成所有操作后,释放捕获
cap.release()
cv.destroyAllWindows()
读取摄像头的执行结果如下:
说在后面的话
这篇文章到这里就要结束啦,希望大家能够通过这篇文章,能够了解视频的基本操作,方便后续过程中,继续深入操作视频。
其实我们能够发现,视频就是连续的图片,所以,操作视频,就是操作每一帧的图片。这样,我想大家就能够通过学习图像处理,掌握视频处理的基本方式啦!
让我们在后续的课程中,再接再厉,学习更多知识吧。