尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

OpenCV 视频操作三连:读取、缩放与保存(逐帧处理全流程)

OpenCV 视频操作三连:读取、缩放与保存(逐帧处理全流程) OpenCV 视频操作三连读取、缩放与保存逐帧处理全流程OpenCV 图像处理课程 · 第 3 章「Video Operation」学习笔记环境Python 3.10 opencv-python 4.5.5.64 PyCharmchapter3目录包含 3 课读取视频 / 缩放视频 / 保存视频章节总览课主题核心函数时长01视频读取cv2.VideoCapture()/cap.read()/cap.release()07:2802视频缩放cv2.resize()CAP_PROP_FRAME_WIDTH/HEIGHT~06:0003视频保存cv2.VideoWriter()09:30视频处理的统一套路是否是否视频末尾视频文件lion_video.mp4cv2.VideoCapture()创建视频实例while 循环cap.read() 逐帧读取ret 是否成功?处理/显示帧resize / 裁剪 / 显示按 q 退出?收尾cap.release() destroyAllWindows()共同模板读取视频 → while 循环逐帧处理 →cap.read()拿帧 →if ret:判断 → 处理/显示 →cv2.waitKey()→ 退出 →cap.release()第 1 课 · 视频读取Video Read什么是帧Frame帧 视频的一系列图像。视频就是按帧率一张张播放的图像序列。本例视频属性时长 27 秒、宽 1920、高 1080、帧率 23 fps每秒 23 帧。读取流程视频路径 → cv2.VideoCapture() → 视频实例 → while 循环: cap.read() 逐帧 → 显示帧完整代码video_read.pyimportcv2 video_path../data/lion_video.mp4capcv2.VideoCapture(video_path)# 创建视频实例whileTrue:ret,framecap.read()# 读一帧返回 (是否成功, 帧数据)ifret:# retTrue → 帧有数据cv2.imshow(video_read,frame)# 显示当前帧else:# retFalse → 已到视频末尾breakif(cv2.waitKey(1)0xFF)ord(q):# 按 q 提前退出breakcv2.destroyAllWindows()# 关闭所有窗口cap.release()# 释放视频实例要点cap.read()返回两个值retbool是否成功读到帧frame图像数据循环流程读到帧 → 显示 → 重复直到retFalse视频末尾跳出cv2.waitKey(1)延迟 1ms至少 1ms否则视频不流畅if cv2.waitKey(1) 0xFF ord(q)按q键中途关闭视频实例不必播完ord(q)返回字符 q 的ASCII 码与waitKey()返回的按键码比较收尾必做cv2.destroyAllWindows()cap.release()第 2 课 · 视频缩放Video Resize为什么缩放用于统一视频/帧的尺寸如模型输入要求、压缩存储。缩放流程视频路径 → VideoCapture → cap.get() 获取宽高 → while: read → resize → 显示完整代码video_resize.pyimportcv2 video_path../data/lion_video.mp4capcv2.VideoCapture(video_path)# 获取原始宽、高注意顺序宽度FRAME_WIDTH高度FRAME_HEIGHTwidthint(cap.get(cv2.CAP_PROP_FRAME_WIDTH))heightint(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))print(Original shape:,width,x,height)# 1920 x 1080# 缩放到一半宽高都除以 2 并转整数除法得浮点需转 intnew_widthint(width/2)new_heightint(height/2)print(New shape:,new_width,x,new_height)# 960 x 540whileTrue:ret,framecap.read()ifret:resized_framecv2.resize(frame,(new_width,new_height))# 每帧 resizecv2.imshow(video_resize,resized_frame)else:breakifcv2.waitKey(1)0xFFord(q):breakcv2.destroyAllWindows()cap.release()要点用cap.get(cv2.CAP_PROP_FRAME_WIDTH)/CAP_PROP_FRAME_HEIGHT获取原始宽高缩放后要int()转整数浮点宽高会报错cv2.resize(frame, (w, h))参数是(width, height)原视频 1920×1080 → 缩放为 960×540第 3 课 · 视频保存Video Save场景读取视频 → 逐帧处理这里做裁剪 500×500→ 用VideoWriter把处理后的帧写入新视频文件。完整代码video_save.pyimportcv2 video_path../data/lion_video.mp4capcv2.VideoCapture(video_path)# 获取原始帧率fpscap.get(cv2.CAP_PROP_FPS)print(Original FPS:,fps)# 创建视频写入器输出文件名, 四种字符编码(编解码器), FPS, (宽, 高)outcv2.VideoWriter(video_save.mp4,cv2.VideoWriter_fourcc(*mp4v),fps*2,(500,500))whileTrue:ret,framecap.read()ifret:crop_frameframe[0:500,0:500]# 裁剪 500x500 区域cv2.imshow(cropped frame,crop_frame)# 可选预览out.write(crop_frame)# 写入视频文件else:breakifcv2.waitKey(1)0xFFord(q):breakcv2.destroyAllWindows()cap.release()out.release()# 释放写入器必须否则文件写不全VideoWriter 四参数参数含义本例1. 文件名输出视频路径video_save.mp42. 编解码器VideoWriter_fourcc(*mp4v)MP4V 编码3. FPS帧率正数fps*2原始 2 倍4. 尺寸保存视频的(宽, 高)(500, 500)cap.read() 读帧1920×1080frame[0:500, 0:500]裁剪 500×500out.write(crop_frame)写入新视频VideoWriter 四参数文件名 fourcc fps×2 (500,500)要点cv2.VideoWriter_fourcc(*mp4v)4 字节编码mp4v用于 MP4out.write(frame)把每帧写入文件必须out.release()否则文件不完整保存后属性核对帧宽 500、帧高 500、帧率47 fps原始 23×2本章小结速查表操作函数 / 语法关键点打开视频cv2.VideoCapture(path)创建实例读帧ret, frame cap.read()ret 判断是否到末尾取宽高cap.get(cv2.CAP_PROP_FRAME_WIDTH)宽度属性帧率cap.get(cv2.CAP_PROP_FPS)视频时长相关缩放帧cv2.resize(frame, (w,h))参数是(宽,高)保存视频cv2.VideoWriter(name, fourcc, fps, (w,h))四参数编码器cv2.VideoWriter_fourcc(*mp4v)mp4v→MP4写帧out.write(frame)写入处理后的帧提前退出cv2.waitKey(1) 0xFF ord(q)按 q收尾cap.release()out.release()释放资源核心易错点cap.read()返回两个值(ret, frame)第一个是 bool收尾必须cap.release()out.release()若保存否则占资源/文件不全cv2.waitKey(1)延迟至少 1ms视频才流畅VideoWriter 的尺寸用(宽, 高)裁剪frame[y1:y2, x1:x2]与之一致缩放/保存尺寸要int()浮点会报错
返回列表