【opencv-Python学习笔记:视频处理】
综合应用1
## 读取播放视频
import cv2 # 读取视频,并展示 cap=cv2.VideoCapture("./video/1.mp4") if cap.isOpened(): print("视频打开成功") while True: ret,frame=cap.read() if not ret: break cv2.imshow("窗口", frame) cv2.waitKey(1) # 释放窗口 cap.release() cv2.destroyAllWindows() else: print("请重新打开视频")
注意:cv2.WaitKey()函数
- 如果参数delay为0,那么程序会一直等待,直到有按下按键的事件发生,才会执行后续的程序,因为读取的是视频帧,所以为0的情况,会一直读取一张照片,直到用户按下按键
- 若delay为一个正数,在这个时间内,用户按下键,就会执行后续程序,若超过时间,则继续执行后续的程序
if cv2.waitKey(1) & 0xFF == ord('q'): break
解释:按下q键程序结束
综合应用2
## 在一个文件夹中有很多视频,将视频进行处理,每30帧保存一张,并存储到一个文件夹,并编号
import cv2 import os def process_video(video_path, output_folder, save_step, start_num): video = cv2.VideoCapture(video_path) frame_count = 0 # 当前帧数 image_count = start_num # 从 start_num 开始编号图片 while True: ret, frame = video.read() if not ret: break # 视频结束,退出循环 frame_count += 1 if frame_count % save_step == 0: # 每隔 save_step 帧保存一次 img_name = os.path.join(output_folder, f"{image_count}.jpg") cv2.imwrite(img_name, frame) print(f"Saved {img_name}") image_count += 1 video.release() print(f"视频 {video_path} 处理完成!") return image_count # 返回下一个图片编号的起始值 def process_videos_in_folder(input_folder, output_folder, save_step=30): # 确保输出文件夹存在 if not os.path.exists(output_folder): os.makedirs(output_folder) image_count = 2320 # 图片编号从0开始 # 遍历文件夹中的所有视频文件 for filename in os.listdir(input_folder): if filename.endswith(".mp4") or filename.endswith(".avi") or filename.endswith(".mov"): # 支持多种视频格式 video_path = os.path.join(input_folder, filename) print(f"开始处理视频: {filename}") # 处理视频并更新下一个文件的起始编号 image_count = process_video(video_path, output_folder, save_step, image_count) # 使用示例 input_folder = './data2/' # 包含视频文件的文件夹路径 output_folder = './data3/' # 存放输出图片的文件夹路径(所有图片放在一个文件夹) save_step = 30 # 每30帧保存一张图片 process_videos_in_folder(input_folder, output_folder, save_step)
1. cv2.VideoCapture()
说明:
cv2.VideoCapture
是 OpenCV 库中用于处理视频文件或视频流的类。它可以从文件、摄像头或视频流中捕获帧,提供各种方法来控制和获取视频属性,是视频处理和计算机视觉应用中常用的工具。
1.1 创建 cv2.VideoCapture
对象
import cv2 # 通过视频文件创建 VideoCapture 对象 cap = cv2.VideoCapture('video.mp4') # 或者通过摄像头创建 VideoCapture 对象,通常 0 表示第一个摄像头 cap = cv2.VideoCapture(0)
解释:
- 里面可以直接填写视频路径,
- 也可以打开摄像头,默认值为-1表示随机摄像头、0表示第一个摄像头、1表示第二个摄像头,以此类推
1.2 open()、isOpened()函数
说明:防止打开摄像头、视频出现错误,用来检测初始化是否成功
语法:ret=cv2.VideoCapture().isOpened()
- 若成功,返回值ret为TRUE
- 若不成功,返回值ret为False
if cap.isOpened(): print("视频文件成功打开") else: print("无法打开视频文件或摄像头")
注意:经常搭配循环来使用
1.3 捕获帧
说明:视频或摄像头经过初始化之后,可以捕获帧了
语法:cap=cv2.VideoCapture().read()
- ret为bool值,表示是否读取成功
- 读取的帧(图像)数据。失败时返回
None
。ret, frame = cap.read() if ret: cv2.imshow("Frame", frame)
1.4 释放
说明:视频处理完之后,需要进行释放,来释放内存
语法:cap=cv2.VideoCapture().release()
1.5 获取、设置视频属性
语法:ret.get() # 获取视频对象属性
语法:ret.set() # 设置视频对象属性
fps = cap.get(cv2.CAP_PROP_FPS) # 获取帧率 width = cap.get(cv2.CAP_PROP_FRAME_WIDTH) # 获取视频宽度 height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT) # 获取视频高度
cap.set(cv2.CAP_PROP_POS_FRAMES, 10) # 设置视频位置到第 10 帧 cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640) # 设置帧宽度为 640 cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480) # 设置帧高度为 480
注意:属性可通过propId来表示
2 . cv2.VideoWriter()
说明:
cv2.VideoWriter()
是 OpenCV 提供的一个类,用于将图像帧保存为视频文件。它允许设置视频编码格式、帧率、分辨率等参数,非常适合在视频处理任务中生成输出视频文件
2.1 创建 cv2.VideoWriter
对象
语法:ret=cv2.VideoWriter(filename, fourcc, fps, frameSize, isColor=True)
解释:
filename
:指定输出视频文件的文件名(包括文件路径和扩展名)。例如'output.avi'
、'output.mp4'
等fourcc
:表示视频的编码格式(FourCC 编码)。FourCC 是一个四字符编码,用于指定视频编码格式
cv2.VideoWriter_fourcc(*'XVID') 生成 .avi
格式的视频文件cv2.VideoWriter_fourcc(*'MP4V') 生成 .mp4
格式的视频文件cv2.VideoWriter_fourcc(*'MJPG') 生成 .avi
格式的文件,支持 JPEG 编码
fps
:视频的帧率(frames per second),即每秒播放的帧数。较高的帧率可以生成更流畅的视频,但会增加文件大小frameSize
:视频帧的大小(宽度,高度),以像素为单位,通常为图像帧的分辨率。isColor
:指定是否为彩色视频。默认为True
表示彩色视频,False
表示灰度视频。import cv2 # 定义输出文件的名称 filename = 'output.avi' # 指定编码格式 fourcc = cv2.VideoWriter.fourcc(*'XVID') # 设置帧率和帧大小 fps = 20.0 frameSize = (640, 480) # 创建 VideoWriter 对象 out = cv2.VideoWriter(filename, fourcc, fps, frameSize, isColor=True)
2.2 write(frame)
:写入帧
说明:
write()
方法用于将图像帧写入视频文件。帧的分辨率(宽度和高度)必须与frameSize
参数一致。import cv2 # 打开视频文件 cap = cv2.VideoCapture('./video/1.mp4') # 获取视频的宽度、高度和帧率 width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) fps = cap.get(cv2.CAP_PROP_FPS) # 创建 VideoWriter 对象 fourcc = cv2.VideoWriter.fourcc(*'MP4V') out = cv2.VideoWriter('output.mp4', fourcc, fps, (width, height)) if cap.isOpened(): while True: ret, frame = cap.read() if not ret: break # 将当前帧写入输出视频 out.write(frame) # 显示当前帧(可选) cv2.imshow('Frame', frame) if cv2.waitKey(1) & 0xFF == ord('q'): break # 释放 VideoCapture 和 VideoWriter 资源 cap.release() out.release() cv2.destroyAllWindows() else: print("无法打开视频文件")
因篇幅问题不能全部显示,请点此查看更多更全内容