如题
1.视频的读
1.1 捕获视频
使用【cv.VedioCapture(参数)】来打开视频,并读取视频的帧。
参数:
若要打开视频文件,则参数是文件路径:cv.VideoCapture(const string& filename)
若要打开摄像头设备,则是0开始的整数:cv.VideoCapture(int device)
例:
import cv2 as cv
cap = cv.VideoCapture(0)
#使用完资源后别忘记释放
cap.release()
1.2 检查视频是否初始化
要注意打开视频存在有失败的可能,那么怎么验证视频打开成功以便后续的操作呢?
可以通过【isOpened()】方法检查它是否已初始化。
- 返回True那么初始化成功。
- 返回False则使用open()打开它。
- 当然也存在isOpened()总是返回False的情况,别慌,解决方法参考:
例:
import cv2 as cv
cap = cv.VideoCapture(0)
if not cap.isOpened(): #cap为1.1中捕获的视频对象
print("Cannot open camera")
exit()
while True:
#操作
#使用完资源后别忘记释放
cap.release()
1.3 开始读取视频的每一帧
这里当然也要检查是否正确读取到帧对吧?这就是【read()】的作用。
使用方法:
ret, frame = cap.read() #cap为1.1、1.2节中的捕获的视频对象。
如果正确读取了帧:
- ret为Ture。
- frame为一帧一帧的视频。
例:
import cv2 as cv
cap = cv.VideoCapture(0)
if not cap.isOpened():
print("Cannot open camera")
exit()
while True:
ret, frame = cap.read()
if not ret:
print("Can't receive frame (stream end?). Exiting ...")
break
#在框架上的操作到这里
#用户的操作
# 完成所有操作后,释放捕获器
cap.release()
1.4 在操作中可能获取或修改视频参数
①【cv2.VedioCapture().get(参数)】获得视频属性
参数:可用整数0~18简单代表视频某一属性值,详情见下表:
注意:如果输入的参数不在0~18内,将会返回0。
0 | 视频文件的当前位置(播放)以毫秒为单位 |
1 | 基于以0开始的被捕获或解码的帧索引 |
2 | 视频文件的相对位置(播放):0=电影开始,1=影片的结尾。 |
3 | 在视频流的帧的宽度 |
4 | 在视频流的帧的高度 |
5 | 帧速率 |
6 | 编解码的4字-字符代码 |
7 | 视频文件中的帧数 |
8 | 返回对象的格式 |
9 | 返回后端特定的值,该值指示当前捕获模式 |
10 | 图像的亮度(仅适用于照相机) |
11 | 图像的对比度(仅适用于照相机) |
12 | 图像的饱和度(仅适用于照相机) |
13 | 色调图像(仅适用于照相机) |
14 | 图像增益(仅适用于照相机)(Gain在摄影中表示白平衡提升) |
15 | 曝光(仅适用于照相机) |
16 | 指示是否应将图像转换为RGB布尔标志 |
17 | × 暂时不支持 |
18 | 立体摄像机的矫正标注(目前只有DC1394 v.2.x后端支持这个功能) |
②【cv2.VedioCapture().set(参数1,参数2)】修改视频属性
参数1:0~18,同get()参数。
参数2:想要设置的值。
使用方法:
import cv2 as cv
cap = cv.VideoCapture(0)
if not cap.isOpened():
print("Cannot open camera")
exit()
while True:
#注意操作的对象,正确示范:
cap.set(3,320)
cap.set(4,240)
ret, frame = cap.read()
if not ret:
print("Can't receive frame (stream end?). Exiting ...")
break
#错误示范,操作对象不为cv::VideoCapture实例
#frame.set(3,320)
#frame.set(4,240)
cap.release()
1.5 对视频的其他常见操作
①正常播放:
②灰度处理:
③反转处理:
具体结果可参考
2.视频的存
2.1 创建视频输出对象
使用【cv2.VideoWriter(参数1,参数2,参数3,参数4)】来创建视频输出对象。
参数1:给输出的视频设置的名称,因此要保存一个视频要设置一个输出对象。
参数2:设置保存视频的编码,使用【cv2.VideoWriter_fourcc(参数)】进行设置,2.2中详细介绍。
参数3:设置保存视频的帧率。
参数4:设置保存视频的宽高。
例:
fourcc = cv.VideoWriter_fourcc(*'XVID') #参数2
vedioWriter = cv.VideoWriter('output.avi',fourcc,20.0,(640, 480))
2.2 确定视频的编码格式
使用【cv2.VideoWriter_fourcc(参数)】来设置输出视频的编码格式。
参数:
①参数种类有很多,可自己设置,具体参照FOURCC四字符码对照表
②可在第一次保存视频时将参数先设置为-1,运行程序结束查看可使用的编码格式。
例:
#参数设置的第一种方式
fourcc = cv.VideoWriter_fourcc(*'XVID');
vedioWriter = cv.VideoWriter('output.avi',fourcc, 20.0, (640, 480))
#参数设置的第二种方式
fourcc = cv.VideoWriter_fourcc('X', 'V', 'I', 'D');
vedioWriter = cv.VideoWriter('output.avi',fourcc, 20.0, (640, 480))
2.3 输出视频
使用【cv2.VideoWriter(参数1,参数2,参数3,参数4).write(参数5)】来输出视频。
参数5:只能是cv.VedioCapture().read()读到的帧,不要直接使用cv.VedioCapture对象。
例:
import cv2 as cv
cap = cv.VideoCapture(0)
#定义编解码器并创建VideoWriter对象
fourcc = cv.VideoWriter_fourcc(*'XVID');
vedioWriter = 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, 0) #写翻转的框架
vedioWriter.write(frame)
#这句可以不写,直接按q结束并输出视频。但是不写你就看不到视频录制时的画面。
cv.imshow('frame', frame)
if cv.waitKey(1) == ord('q'):
break
cap.release()
vedioWriter.release()
cv.destroyAllWindows()
运行成功,视频录制并保存~
3.哥哥哥哥,留下三连你女朋友知道了不会生气吧