OpenCV | 基于视频的基础操作

发布于:2024-04-16 ⋅ 阅读:(30) ⋅ 点赞:(0)

一. OpenCV 关于视频的基础操作

1. cv.VideoCapture ( ) 读取摄像头 / 视频文件

	cv.VideoCapture ( )
	参数:
		参数是0时,默认打开笔记本的内置第一个摄像头
		参数是视频文件路径时,表示读取对应文件
# 从摄像机获取视频
# 创建一个基于摄像头的视频读取流,给定基于第一个视频设备
capture =cv.VideoCapture(0)

# 视频文件读入
# 创建一个基于文件的视频读取流,给定基于第一个视频设备
capture = cv.VideoCapture("video1.avi")

2. cv.VideoCapture ( ).set ( ) 设置视频属性

	cv.VideoCapture().set( )
	注意:
		实际参数会发生稍微的偏移
	作用:
		设置视频的宽度,高度,帧率,亮度,对比度等属性
	参数影响:
		这些属性可以影响视频处理的质量和速度
	参数设置:
		capture.set(CV_CAP_PROP_FRAME_WIDTH, 1080) => 宽度
		capture.set(CV_CAP_PROP_FRAME_HEIGHT, 960) => 高度
		capture.set(CV_CAP_PROP_FPS, 30) => 帧率 帧
		capture.set(CV_CAP_PROP_BRIGHTNESS, 1) => 亮度
		capture.set(CV_CAP_PROP_CONTRAST,40) => 对比度 40
		capture.set(CV_CAP_PROP_SATURATION, 50) => 饱和度 50
		capture.set(CV_CAP_PROP_HUE, 50) => 色调 50
		capture.set(CV_CAP_PROP_EXPOSURE, 50) => 曝光 50 获取摄像头参数

3. cv.VideoCapture ( ).get ( ) 打印视频属性

	参数:
		cv.VideoCapture.get(0) / cv.CAP_PROP_POS_MSEC  视频文件的当前位置(播放)以毫秒为单位
		cv.VideoCapture.get(1) / cv.CAP_PROP_POS_FRAMES  基于以0开始的被捕获或解码的帧索引
		cv.VideoCapture.get(2) / cv.CAP_PROP_POS_AVI_RATIO  视频文件的相对位置(播放):0=电影开始,1=影片的结尾
		cv.VideoCapture.get(3) / cv.CAP_PROP_FRAME_WIDT  视频流的帧的宽度
		cv.VideoCapture.get(4) / cv.CAP_PROP_FRAME_HEIGHT  视频流的帧的高度
		cv.VideoCapture.get(5) / cv.CAP_PROP_FPS  帧速率
		cv.VideoCapture.get(6) / cv.CAP_PROP_FOURCC  编解码的4字-字符代码
		cv.VideoCapture.get(7) / cv.CAP_PROP_FRAME_COUNT  视频文件中的帧数
		cv.VideoCapture.get(8) / cv.CAP_PROP_FORMAT  返回对象的格式
		cv.VideoCapture.get(9) / cv.CAP_PROP_MODE  返回后端特定的值,该值指示当前捕获模式
		cv.VideoCapture.get(10) / cv.CAP_PROP_BRIGHTNESS  图像的亮度(仅适用于照相机)
		cv.VideoCapture.get(11) / cv.CAP_PROP_CONTRAST  图像的对比度(仅适用于照相机)
		cv.VideoCapture.get(12) / cv.CAP_PROP_SATURATION  图像的饱和度(仅适用于照相机)
		cv.VideoCapture.get(13) / cv.CAP_PROP_HUE  色调图像(仅适用于照相机)
		cv.VideoCapture.get(14) / cv.CAP_PROP_GAIN  图像增益(仅适用于照相机)(Gain在摄影中表示白平衡提升)
		cv.VideoCapture.get(15) / cv.CAP_PROP_EXPOSURE  曝光(仅适用于照相机)
		cv.VideoCapture.get(16) / cv.CAP_PROP_CONVERT_RGB  指示是否应将图像转换为RGB布尔标志
		cv.VideoCapture.get(17) / cv.CAP_PROP_WHITE_BALANCE  × 暂时不支持|
		cv.VideoCapture.get(18) / cv.CAP_PROP_RECTIFICATION  立体摄像机的矫正标注(目前只有DC1394 v.2.x后端支持这个功能)
capture =cv.VideoCapture(0)
# 未设置视频的宽度,高度
size = (int(capture.get(cv.CAP_PROP_FRAME_WIDTH)),
        int(capture.get(cv.CAP_PROP_FRAME_HEIGHT)))
print(size)  # (640, 480)
capture =cv.VideoCapture(0)

# 设置视频的宽度,高度
success=capture.set(cv.CAP_PROP_FRAME_WIDTH, 1880)
if success:  # if成立时,success不等于0
    print("设置宽度成功")  # 设置宽度成功
success=capture.set(cv.CAP_PROP_FRAME_HEIGHT, 1480)
if success:
    print("设置高度成功")  # 设置长度成功

# 打印属性
size = (int(capture.get(cv.CAP_PROP_FRAME_WIDTH)),
        int(capture.get(cv.CAP_PROP_FRAME_HEIGHT)))
print(size)  # (1280, 720)

4. cv.VideoCapture ( ).read ( ) 读帧

	cv.VideoCapture ( ).read ( )
	作用:
		从视频流中读取1帧图像
		【注意】按帧读取视频
	返回值:
		第一个返回值是布尔型:
			读取正确,则返回True,
			读取失败或读取视频结尾,则会返回False
		第二个返回值是每一帧的图像:
			这里图像是三维矩阵,读取的图像为BGR格式
# 读取当前时刻的摄像头捕获的1帧图像
success, frame = capture.read()
# 遍历&等待任意键盘输入
# -1表示等待delay后,没有任何键盘输入(对于视频而言几乎没等)
while success and cv.waitKey(1) == -1:  # 读取正确 and 1毫秒内无键盘输入 == True
    cv.imshow('frame', frame)
    # 读取下一帧的图像
    success, frame = capture.read()

5. capture.release ( ) 释放资源

capture.release()
cv.destroyAllWindows()

6. cv.VideoWriter ( ) 视频写入

	video_writer = cv.VideoWriter(filename, fourcc, fps, frameSize[, isColor]) 
		作用:
			创建一个视频输出对象,即将读取的图像写入指定路径下的文件中
		参数:
			filename:第一个参数是要保存的文件的路径
			fource:指定编码器
			fps:要保存的视频的帧率
			frameSize:要保存的文件的画面尺寸
			isColor:指示是黑白画面还是彩色的画面
	
	video_writer.write(frame)
	作用:
		将读取到的图像写入video_writer中
		
	其中,fource可选择模式 :
			cv2.VideoWriter_fourcc('M','P','4','V'):MPEG-4编码 .mp4 可指定结果视频的大小
			cv2.VideoWriter_fourcc('X','2','6','4'):MPEG-4编码 .mp4 可指定结果视频的大小
			cv2.VideoWriter_fourcc('I','4','2','0'):YUV编码类型,文件名后缀为.avi 广泛兼容,但会产生大文件
			cv2.VideoWriter_fourcc('P','I','M','I'):MPEG-1编码类型,文件名后缀为.avi
			cv2.VideoWriter_fourcc('X','V','I','D'):MPEG-4编码类型,文件名后缀为.avi,可指定结果视频的大小
			cv2.VideoWriter_fourcc('T','H','E','O'):Ogg Vorbis,文件名后缀为.ogv
			cv2.VideoWriter_fourcc('F','L','V','1'):Flash视频,文件名后缀为.flv

【注意】

	在OpenCV中,写入视频时常需要减去1的原因是:
		因为视频的帧数是从0开始计数的,而不是从1开始计数的
		即可以理解为第0帧无内容
		因此,当要写入10秒时长的视频时,需要计算出总共的帧数,公式为10*fps-1

感谢阅读🌼
如果喜欢这篇文章,记得点赞👍和转发🔄哦!
有任何想法或问题,欢迎留言交流💬,我们下次见!
本文相关代码存放位置
    【Opencv2 视频操作

祝愉快🌟!