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()
解释:
- 导入
cv2
模块,定义视频文件的名称和要保存到不同视频文件中的文件部分:
import cv2
file = "video.avi"
parts = [(15, 30), (50, 79)]
- 定义一个视频捕获设备,从视频文件中读取帧,并从中读取一次以获取视频帧的形状:
cap = cv2.VideoCapture(file)
ret, frame = cap.read()
h, w, _ = frame.shape
- 定义一个fourcc(四字码),定义一个视频作者列表;每个要生成的视频一个:
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
- 在
while
循环里面使用一个for
循环,循环遍历parts的起始帧和结束帧,使用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()
我有一个视频,我想使用帧数获取该视频的特定部分并保存它们。
例如,如果有一个视频,它总共有 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(四字码),定义一个视频作者列表;每个要生成的视频一个:
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
- 在
while
循环里面使用一个for
循环,循环遍历parts的起始帧和结束帧,使用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()