Opencv-Python学习笔记
此文档为本人(初学)主要参考由段力辉翻译的OpenCV-Python中文教程官方教程,并结合多方资料总结成学习笔记,如有侵权请联系本人
第二章 Opencv的GUI特性(2)
2.2 对视频的操作
目标:
- 学会读取视频文件,显示视频,保存视频文件
- 学会从摄像头获取并显示视频
- 学习函数:cv2.VideoCapture(),cv2.VideoWriter()
2.2.1 用摄像头捕获视频
函数解析:
- VideoCapture(flag)——读取视频
flag:
• 参数可以是设备的索引号,设备索引号就是在指定要使用的摄像头,一般的笔记本电脑都有内置摄像头,所以参数就是 0。你可以通过设置成 1 或者其他的来选择别的摄像头。
• 参数可以是一个视频文件,写入视频文件的路径 - VideoWriter(src, fourcc, fps, frameSize[, isColor])——保存视频文件
src:要保存的文件的路径
fourcc1:fourcc 指定编码器
fps:要保存的视频的帧率
frameSize:要保存的文件的画面尺寸
[,isColor]:True表示彩色图,False表示灰度图
实战演练:
示例一:捕获用摄像头返回视频得到的一帧一帧图片
import cv2 as cv
capture = cv.VideoCapture(0)#打开摄像头
while capture.isOpened():#只要没跳出循环,则会循环播放每一帧图片
#capture.isOpened()检查摄像头是否成功初始化,如果返回值是True,表示摄像头正常打开,如果是False,表示摄像头打开失败,需要使用capture.open()
print("摄像头初始化成功")
ret,frame = capture.read()
#read()函数读取视频(摄像头)的某帧,它能返回两个参数,第一个参数是bool型的ret,其值为True或False,代表是否读到图片,第二个参数是frame,表示当前截取的一帧图片
frame=cv.flip(frame,1)
#翻转图像 0:沿X轴翻转(垂直翻转) 大于0:沿Y轴翻转(水平翻转) 小于0:先沿X轴翻转,再沿Y轴翻转,等价于旋转180°
cv.imshow("VIDEO",frame)
if cv.waitKey(1) == 27 :#27表示ESC
capture.release()#capture.release()表示停止捕获视频
cv.destroyAllWindows()
break
print("摄像头初始化失败")
显示结果如下:
其余函数解析:
- capture.read()返回两个参数,第一个参数ret表示布尔值(True/False),如果帧读取正确,返回True。可通过检查它的返回值来查看视频文件是否已经到了结尾。第二个参数frame表示当前帧,用于图像操作。
- capture.isOpened()返回布尔值(True/False)。如果摄像头初始化正确,返回True,可用来检查摄像头是否正确打开。
- capture.open()在摄像头初始化失败时使用,可打开摄像头。
- capture.release()用来释放(关闭)摄像头
- VideoCapture.get()【补充】可获得视频的一些参数信息,部分可通过 capture.set(propId,value) 修改
OpenCV VideoCapture.get()参数详解
示例二:读入视频文件
import cv2 as cv
capture = cv.VideoCapture(r"D:\Demons_Working\Robomaster\视觉组\opencv\视觉素材\2.MOV")#读入视频文件
while True:#只要没跳出循环,则会循环播放每一帧图片
#capture.isOpened()检查摄像头是否成功初始化,如果返回值是True,表示摄像头正常打开,如果是False,表示摄像头打开失败,需要使用capture.open()
ret,frame = capture.read()
#read()函数读取视频(摄像头)的某帧,它能返回两个参数,第一个参数是bool型的ret,其值为True或False,代表是否读到图片,第二个参数是frame,表示当前截取的一帧图片
frame=cv.flip(frame,1)
#翻转图像 0:沿X轴翻转(垂直翻转) 大于0:沿Y轴翻转(水平翻转) 小于0:先沿X轴翻转,再沿Y轴翻转,等价于旋转180°
cv.namedWindow("VIDEO",cv.WINDOW_NORMAL)
cv.imshow("VIDEO",frame)
if cv.waitKey(1) == 27 :#27表示ESC
#waitKey(1)表示间隔1ms,这里相当于加快视频播放速度
print("终止播放")
break
capture.release()#capture.release()表示停止捕获视频
cv.destroyAllWindows()
显示结果如下:
与从摄像头中捕获一样,你只需要把设备索引号改成视频文件的名字。在播放每一帧时,使用 cv2.waiKey() 设置适当的持续时间。如果设置的太低视频就会播放的非常快,如果设置的太高就会播放的很慢(你可以使用这种方法 控制视频的播放速度)。通常情况下 25 毫秒就可以了。
示例三:保存视频
import cv2 as cv
capture = cv.VideoCapture(0)
fourcc = cv.VideoWriter_fourcc(*'XVID')#使用XVID编码器
out = cv.VideoWriter(r"D:\Demons_Working\Image&Video\Video\save_video.avi",fourcc,20.0,(640,480),True)
#从左至右分别是:文件保存路径、编码器、帧率、视频宽高、彩色图
while capture.isOpened():
ret,frame = capture.read()
if ret == True:
frame = cv.flip(frame,1)
cv.imshow("VIDEO",frame)
out.write(frame)
if cv.waitKey(1) == 27:
break
else:
break
capture.release()#释放摄像头
out.release()#停止写入视频
cv.destroyAllWindows()
#释放内存
显示结果如下:
其余函数解析:
- cv.flip() 函数用来翻转一帧图像,他需要两个参数,第一个参数是要翻转的图像,第二个参数是翻转的模式(0代表按沿 x 轴翻转,整数(比如1)代表按 y 轴翻转,负数代表沿两个坐标轴同时翻转)。
- out.write() 函数接收一张图片并把它写到指定的位置,这里指定的位置就是我们创建 VideoWriter 对象时传进去的位置。
如果读者对此函数仍存疑惑推荐此链接希望能为大家解惑OpenCV 用 VideoWriter 创建视频(Python 版本)
FourCC全称Four-Character Codes,代表四字符代码 (four character code), 它是一个32位的标示符,其实就是typedef unsigned int FOURCC;是一种独立标示视频数据流格式的四字符代码。视频播放软件通过查询 FourCC 代码并且寻找与 FourCC 代码相关联的视频解码器来播放特定的视频流。比如: DIV3 = DivX Low-Motion, DIV4 = DivX Fast-Motion, DIVX = DivX4, FFDS = FFDShow 等。比如wav、avi等RIFF文件的标签头标示,Quake 3的模型文件.md3中也大量存在等于“IDP3”的FOURCC。【可用的代码列表可以在fourcc.org中找到】
在Fedora:DIVX,XVID,MJPG,X264,WMV1,WMV2。 (XVID是更优选的,MJPG导致高尺寸视频,X264提供非常小的视频)
在Windows中:DIVX(更多待测试和添加)
FourCC代码作为MvPV传递为cv2.VideoWriter_fourcc(‘M’,‘J’,‘P’,‘G’)或cv2.VideoWriter_fourcc(*'MJPG) ↩︎