之前实现了由帧到视频的生成,有时需要只提取视频中的某一段或某几帧,就需要对视频进行拆分了。 拆分程序比较简单,主要利用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张影像。 可以看到实现了将视频拆分成单独图像帧的目标。

本文作者原创,未经许可不得转载,谢谢配合

返回顶部