目录
要使用OpenCV保存视频,可以按照以下步骤进行操作:
- """
- OpenCV打开摄像头
- 设置摄像头参数
- 录制视频
- """
1. 导入必要的库:
import cv2
2. 创建一个VideoWriter对象:
- #定义保存视频的文件名、编解码器、帧率和分辨率
- filename = 'output.avi'
- codec = cv2.VideoWriter_fourcc(*'XVID')
- fps = 30.0
- frame_size = (640, 480)
-
- #创建VideoWriter对象
- video_writer = cv2.VideoWriter(filename, codec, fps, frame_size)
3. 从摄像头或者视频文件中读取帧:
- #打开摄像头或者视频文件
- cap = cv2.VideoCapture(0) #传入0表示打开默认摄像头
- #cap = cv2.VideoCapture('input.avi') #传入视频文件名
-
- while True:
- #读取一帧
- ret, frame = cap.read()
-
- #显示帧
- cv2.imshow('Video', frame)
-
- #保存帧到视频文件
- video_writer.write(frame)
-
- #按下q键退出循环
- if cv2.waitKey(1) & 0xFF == ord('q'):
- break
-
- #释放资源
- cap.release()
- video_writer.release()
- cv2.destroyAllWindows()
-
- """
- cv2.VideoCapture() 函数从摄像头或者视频文件中读取帧
- cv2.imshow() 函数显示
- video_writer.write() 函数将帧写入视频文件
- cap.release() 释放摄像头或者视频文件资源
- video_writer.release() 释放视频文件资源
- cv2.destroyAllWindows() 关闭所有窗口
- """
个人笔记(仅供参考)
- """
- 图像显示:
- cv2.imshow(winname,img)
- winname: 窗口名称
- img: 显示的图像
- 图层(通道)分离:
- cv2.split(img)
- img: 要分离的图像
- 图层(通道)合并:
- cv2.merge(img)
- img: 要合并的色彩通道
- 视频流读取:
- cv2.VideoCapture(filename)
- filename: 打开的摄像头设备或者打开的视频路径
- cv2.VideoCapture(0)
- 0: 读取摄像头, 0为摄像头索引,当有多个摄像头时,从 0开始编号
- 视频流参数读改:
- cap(变量名).get(propId) 获得视频的一些参数信息
- propId: 可以是 0到 18之间的任何整数,即下表代码
- cap(变量名).get(3),cap.get(4) 查看每一帧的宽和高,默认得到的值是 640x480
- cap(变量名).set(propId,value) 修改参数
- value: 想要设置成的新值
- cap(变量名).set(3,320),cap.set(4,240) 来把宽和高改成 320x240
- propId 可以以数字代替,按顺序从0开始
- 代码 代替数字 代码 代替数字
- CV_CAP_PROP_POS_MSEC 0 CV_CAP_PROP_BRIGHTNESS 10
- CV_CAP_PROP_POS_FRAMES 1 CV_CAP_PROP_CONTRAST 11
- CV_CAP_PROP_POS_AVI_RATIO 2 CV_CAP_PROP_SATURATION 12
- CV_CAP_PROP_FRAME_WIDTH 3 CV_CAP_PROP_HUE 13
- CV_CAP_PROP_FRAME_HEIGHT 4 CV_CAP_PROP_GAIN 14
- CV_CAP_PROP_FPS 5 CV_CAP_PROP_EXPOSURE 15
- CV_CAP_PROP_FOURCC 6 CV_CAP_PROP_CONVERT_RGB 16
- CV_CAP_PROP_FRAME_COUNT 7 CV_CAP_PROP_WHITE_BALANCE 17
- CV_CAP_PROP_FORMAT 8 CV_CAP_PROP_RECTIFICATION 18
- CV_CAP_PROP_MODE 9
- 视频流保存:
- VideoWriter(filename,fourcc,fps,frameSize)
- filename: 打开的摄像头设备或者打开的视频路径
- fourcc:
- 指定编码器 (编码器是将数据进行编制、转换为可用以通讯、传输和存储的信号形式的设备)
- fps: 要保存的视频的帧率
- frameSize: 要保存的文件的画面尺寸
- 视频流接收:
- ret,frame = cam(变量名).read()
- cam(变量名).read() 返回一个布尔值
- ret 接收布尔值,如果为 True,则说明每一帧图像都被正常读取
- frame 用于接收得到的每一帧图片
- 视频流编码设置:
- cv.VideoWriter_fourcc()
- 常用编码格式有以下几种:
- Fourcc 视频文件后缀
- cv2.VideoWriter_fourcc('M', 'P', '4', 'V') .mp4
- cv2.VideoWriter_fourcc('X', 'V', 'I', 'D') .avi
- cv2.VideoWriter_fourcc('I', '4', '2', '0') .avi
- cv2.VideoWriter_fourcc('P', 'I', 'M', 'I') .avi
- cv2.VideoWriter_fourcc('T', 'H', 'E', 'O') .ogv
- cv2.VideoWriter_fourcc('F', 'L', 'V', '1') .flv
- """
通过摄像头拍摄视频并保存到相应路径:
- import cv2 as cv
-
- cap = cv.VideoCapture(0) # 读取摄像头
- cap.set(cv.CAP_PROP_EXPOSURE,0) # 视频流参数读改 或者 cap.set(15,0)
- # cap.set(3,4080),cap.set(4,3060) # 把窗口宽和高改成 4080x3060
-
- fourcc = cv.VideoWriter_fourcc(*"MJPG")
- xin = cv.VideoWriter("xin_1.avi",fourcc,80,(640,480)) # 视频流保存
-
- while(cap.isOpened()): # 用于判断 cap是否正常初始化,返回布尔值,正常则返回 True
- ret,frame = cap.read()
- xin.write(frame)
- cv.imshow("CAP",frame)
- if cv.waitKey(1) == 27: # 等候 1ms,播放下一帧
- break
-
- cap.release()
- xin.release()
- cv.destroyAllWindows()