Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用python中的opencv将视频的特定部分保存到单独的视频中?_Python_Opencv_Video Editing - Fatal编程技术网

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

如何使用python中的opencv将视频的特定部分保存到单独的视频中?,python,opencv,video-editing,Python,Opencv,Video Editing,我有一个视频,我想用帧号获得视频的特定部分并保存它们 例如,如果有一个视频,它总共有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) succe

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

例如,如果有一个视频,它总共有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()
  • 定义一个视频捕获设备,从视频文件中读取帧并读取一次,以获得视频帧的形状:
  • 定义一个fourcc(四字符代码),并定义一个视频编写器列表;要生成的每个视频都有一个:
  • 定义
    while
    循环,但在此之前,定义一个变量以跟踪while循环在捕获设备中的帧:
  • 循环中使用
    for
    循环,而在
    循环中,循环零件的开始帧和结束帧,使用
    枚举
    方法允许程序在需要时访问每次迭代的零件索引。如果在
    while
    循环之前定义的变量介于(包括)部件的开始和结束之间,则将该帧写入相应的视频写入器(使用
    enumerate
    方法提供的索引):

  • 我在h,w,=frame.shape中得到一个错误。当我打印图像时,它没有给出任何信息。即使当我打印的宽度和高度和帧,我得到0。我也检查了路径,它是正确的。我保存的视频部分没有播放。请告诉我该怎么解决this@codexx您是如何输入路径的?这是视频的完整路径吗?我试着输入了整个路径,只是名称太多了,两者都没有working@codexxWindows还是Linux?它是Windows。当我打印一个特定的帧时,该帧不显示,并且显示为无响应。
    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, (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()