如何解决如何在python中使用opencv将视频的特定部分保存到单独的视频中?
例如,如果有一个视频,它总共有 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,79)]
- 定义视频捕获设备以从视频文件中读取帧并从中读取一次以获取视频帧的形状:
cap = cv2.VideoCapture(file)
ret,_ = frame.shape
- 定义一个fourcc (四字符代码),并定义一个视频作者列表;您要生成的每个视频对应一个:
fourcc = cv2.VideoWriter_fourcc(*"XVID")
writers = [cv2.VideoWriter(f"part{start}-{end}.avi",end in parts]
- 定义一个
while
循环,但在此之前,定义一个变量来跟踪 while 循环在捕获设备中所处的帧:
f = 0
while ret:
f += 1
- 在
for
循环内使用while
循环,循环遍历各部分的开始帧和结束帧,使用enumerate
方法允许程序访问部分的索引每次迭代都在需要时进行。如果在while
循环之前定义的变量在(inclusive) 部分的开始和结束之间,则将该帧写入相应的视频编写器 (使用由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()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。