【问题标题】:How to save specific parts of video into separate videos using opencv in python?如何在 python 中使用 opencv 将视频的特定部分保存到单独的视频中?
【发布时间】:2021-07-24 17:33:05
【问题描述】:

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

例如,如果有一个视频,它总共有 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 做到这一点?

【问题讨论】:

    标签: python opencv video-editing


    【解决方案1】:

    我会这样做:

    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 循环之前定义的变量在(包括) 部分的开始和结束之间,则将该帧写入相应的视频写入器(使用@987654332 提供的索引@方法)
        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()
    

    【讨论】:

    • 我在 h、w、_ = frame.shape 中遇到错误。当我打印图像时,它没有给出任何信息。即使我打印宽度和高度以及框架的宽度和高度,我也得到了 0。我也检查了路径,它是正确的。我保存的视频部分没有播放。请告诉我应该如何解决这个问题
    • @codexx 你是怎么输入你的路径的?它是视频的完整路径吗?
    • 我尝试输入整个路径,只是名称也不起作用
    • 是窗户。当我打印特定框架时,​​该框架不显示并且显示没有响应。
    • 当我将writers[i].write(frame) 替换为cv2.imwrite('new_frame_'+str(frame)+'.jpg',frame) 时,它什么也不写。你能告诉我哪里出错了吗?
    猜你喜欢
    • 2020-04-01
    • 2019-12-04
    • 1970-01-01
    • 2015-06-01
    • 2020-07-09
    • 2020-11-18
    • 2023-01-19
    • 2019-09-20
    • 2016-04-08
    相关资源
    最近更新 更多