繁体   English   中英

如何使用 python 中的 opencv 将视频的特定部分保存到单独的视频中?

[英]How to save specific parts of video into separate videos using opencv in python?

我有一个视频,我想使用帧号获取该视频的特定部分并保存它们。

例如,如果有一个视频,它总共有 200 帧,我想提取视频的某些特定部分,比如从第 15 帧到第 30 帧、第 50 到第 79 帧等,我想分别保存这些部分。

cap= cv2.VideoCapture('Trademill.mp4')
video_length = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) 
print ("Number of frames: ", video_length)

success,image = cap.read()
count = 0
while success:
cv2.imwrite("frame%d.jpg" % count, image)          
success,image = cap.read()
count += 1

如何使用 python 和 OpenCV 执行此操作?

这是我的做法:

import cv2

file = "video.avi"
parts = [(15, 30), (50, 79)]

cap = cv2.VideoCapture(file)
ret, frame = cap.read()
h, w, _ = frame.shape

fourcc = cv2.VideoWriter_fourcc(*"XVID")
writers = [cv2.VideoWriter(f"part{start}-{end}.avi", fourcc, 20.0, (w, h)) for start, end in parts]

f = 0
while ret:
    f += 1
    for i, part in enumerate(parts):
        start, end = part
        if start <= f <= end:
            writers[i].write(frame)
    ret, frame = cap.read()

for writer in writers:
    writer.release()

cap.release()

解释:

  1. 导入cv2模块,定义视频文件的名称和要保存到不同视频文件中的文件部分:
import cv2

file = "video.avi"
parts = [(15, 30), (50, 79)]
  1. 定义一个视频捕获设备,从视频文件中读取帧并从中读取一次,以获得视频帧的形状:
cap = cv2.VideoCapture(file)
ret, frame = cap.read()
h, w, _ = frame.shape
  1. 定义一个fourcc (四字符码) ,定义一个视频作者列表; 您要生成的每个视频都有一个:
fourcc = cv2.VideoWriter_fourcc(*"XVID")
writers = [cv2.VideoWriter(f"part{start}-{end}.avi", fourcc, 20.0, (w, h)) for start, end in parts]
  1. 定义一个while循环,但在此之前,定义一个变量来跟踪while循环在捕获设备中的哪个帧:
f = 0
while ret:
    f += 1
  1. while循环中使用for循环,遍历部件的开始和结束帧,使用enumerate方法允许程序在需要时访问每次迭代所在的部件的索引。 如果在while循环之前定义的变量介于(包括)部分的开始和结束之间,则将该帧写入相应的视频写入器(使用enumerate方法提供的索引)
    for i, (start, end) in enumerate(parts):
        if start <= f <= end:
            writers[i].write(frame)
    ret, frame = cap.read()
  1. 最后,释放所有视频编写器和捕获设备:
for writer in writers:
    writer.release()

cap.release()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM