OpenCV VideoCapture类实战:视频帧提取与参数获取
本文详解OpenCV中VideoCapture类的核心用法,涵盖视频文件、摄像头及图片序列的读取。通过Python代码示例,演示如何获取视频FPS、总帧数等关键参数,并实现按间隔提取视频帧保存为图片的完整流程,包含命令行参数解析与文件路径处理。
VideoCapture类的核心应用场景
在OpenCV库中,VideoCapture类是处理视频数据的基础组件。它主要支持三种数据源的读取操作:直接读取本地视频文件、从连续的图片序列中合成视频流,以及实时捕获摄像头画面。理解其基本调用方式,是进行后续视频分析或处理的前提。
关键参数获取方法
在开始逐帧处理前,通常需要先了解视频的基本属性。通过调用VideoCapture对象的get()方法,可以获取视频的关键元数据。常用的属性标识符包括cv2.CAP_PROP_FPS用于获取每秒帧数,以及cv2.CAP_PROP_FRAME_COUNT用于获取视频总帧数。结合这两个参数,可以计算出视频的总时长,公式为总帧数除以FPS。
代码实现:视频帧提取流程
以下Python脚本展示了完整的视频处理流程。代码使用了argparse模块来接收命令行输入,支持指定输入视频路径和输出文件夹。主要逻辑包括初始化视频源、读取第一帧以验证有效性、获取视频属性、创建输出目录,以及通过循环按固定间隔保存帧。
#!/usr/bin/env python
#-*- coding:utf-8 -*-
# @Time : 19-4-21 上午10:31
# @Author : chen
"""
VideoCapture()的使用
"""
import cv2
import argparse
import os
import pdb
ap = argparse.ArgumentParser()
ap.add_argument("-v", "--videoPath", default="./video_1.mp4", help="path to input video")
ap.add_argument("-o", "--outputPath", default="grabImages", help="path to output frames")
args = vars(ap.parse_args())
# 初始化,并读取第一帧
# rval表示是否成功获取帧
# frame是捕获到的图像
vc = cv2.VideoCapture(args["videoPath"])
rval, frame = vc.read()
# 获取视频fps
fps = vc.get(cv2.CAP_PROP_FPS)
# 获取视频总帧数
frame_all = vc.get(cv2.CAP_PROP_FRAME_COUNT)
print("[INFO] 视频FPS: {}".format(fps))
print("[INFO] 视频总帧数: {}".format(frame_all))
print("[INFO] 视频时长: {}s".format(frame_all/fps))
outputPath = os.path.sep.join([args["outputPath"]])
if os.path.exists(outputPath) is False:
print("[INFO] 创建文件夹,用于保存提取的帧")
os.mkdir(outputPath)
# 每隔100帧保存一张图片
frame_interval = 100
# 统计当前帧
frame_count = 1
# 保存图片个数
count = 0
while rval:
rval, frame = vc.read()
if frame_count % frame_interval == 0:
filename = os.path.sep.join([outputPath, "test_{}.jpg".format(count)])
cv2.imwrite(filename, frame)
count += 1
print("保存图片:{}".format(filename))
frame_count += 1
# 关闭视频文件
vc.release()
print("[INFO] 总共保存:{}张图片".format(count))关键步骤解析
代码执行流程中,vc.read()是核心操作。该函数返回一个布尔值rval和图像数组frame。rval为True表示成功读取一帧,为False则通常意味着视频结束或读取失败。在while循环中,程序持续调用read()直到视频结束。
为了优化处理效率,示例中设置了frame_interval = 100,即每隔100帧保存一张图片。通过frame_count % frame_interval == 0判断是否满足保存条件。若满足,则使用os.path.sep.join()构建安全的文件路径,并通过cv2.imwrite()将当前帧保存为JPG格式图片。最后,务必调用vc.release()释放视频资源,避免内存泄漏。
总结
通过上述示例,我们掌握了利用OpenCV的VideoCapture类进行视频属性查询和帧提取的基本方法。实际应用中,可根据需求调整frame_interval或结合其他图像处理算法,实现更复杂的视频分析任务。
以上就是OpenCV中VideoCapture类的使用详解的详细内容,更多关于OpenCV视频处理的技术资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









