之前实现了由帧到视频的生成,有时需要只提取视频中的某一段或某几帧,就需要对视频进行拆分了。
拆分程序比较简单,主要利用OpenCV的Capture对象配合imwrite()
实现。
这里给出的代码不是最新的代码,有点小问题。最新代码放在了Github上,点击查看。
一、代码
# coding=utf-8
import cv2
# 输入需要处理的视频文件
video_path = raw_input("Input path of video:\n")
cap = cv2.VideoCapture(video_path)
# 获取视频的总帧数、fps
frames = int(cap.get(7))
fps = int(cap.get(5))
print frames, 'frames in total.'
# 输入输出影像的文件夹
out_path = raw_input("Input save path of frames:\n")
# 输入采样间隔
interval = 1
interval = input("Input interval of frames(1 means output every frame):\n")
# 输入开始时间
start = 0
start = input("Input start time of output(e.g. 10.3 means starts from 10.3 second):\n")
# 输入结束时间
end = 0
end = input("Input end time of output(e.g. 20.1 means ends at 20.1 second):\n")
# 计算需要输出的帧数
startIndex = int(start * fps)
endIndex = int(end * fps)
rangeFrames = endIndex - startIndex
count = 0
# 判断如果小于0,返回
if rangeFrames < 0:
print 'Error.'
exit()
# 输出提示信息
print rangeFrames / interval, 'frames are going to be outputted.'
# 读取开始帧之前的内容,将将读取帧数定位到startIndex
for i in range(startIndex):
ret, frame = cap.read()
print "Pre-processing...", round((i * 1.0 + 1) / startIndex * 100, 2), '%'
print '---Cutting---'
# 循环输出帧
for i in range(startIndex, endIndex, interval):
ret, frame = cap.read()
if frame is None:
break
else:
# 输出影像文件
cv2.imwrite(out_path + "\\" + "%04d" % (i + 1) + ".jpg", frame)
count += 1
print 'Cutting...', round((count * 1.0 / (rangeFrames / interval)) * 100, 2), "% finished."
# 释放对象
cap.release()
二、效果测试
如图所示,输入相关参数如下: 完成后输出提示如下。 在文件管理器中显示各帧如下。 由于原始视频FPS是25,所以截取了1s内的所有帧是25张影像。 可以看到实现了将视频拆分成单独图像帧的目标。
本文作者原创,未经许可不得转载,谢谢配合