我有一个视频,我想使用帧号获取该视频的特定部分并保存它们。
例如,如果有一个视频,它总共有 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()
说明:
cv2
模块,定义视频文件的名称以及要保存到不同视频文件中的文件部分: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]
while
循环,但在此之前,定义一个变量来跟踪 while 循环在捕获设备中所处的帧:f = 0
while ret:
f += 1
for
循环内部使用while
循环,循环遍历部件的起始帧和结束帧,使用该enumerate
方法允许程序在需要时访问每次迭代所在的部件的索引。如果while
循环之前定义的变量介于(包括)部分的开始和结束之间,则将该帧写入相应的视频编写器(使用enumerate
方法提供的索引): for i, (start, end) in enumerate(parts):
if start <= f <= end:
writers[i].write(frame)
ret, frame = cap.read()
for writer in writers:
writer.release()
cap.release()
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句