每秒提取文件夹中所有视频的帧

时间:2018-07-23 08:22:27

标签: python loops opencv ffmpeg frames

我试图在视频的每一秒中提取一帧,同时在一个文件夹中包含多个视频。我可以将其用于这样的1个视频,但是我想弄乱了所有视频的循环。以下是1个有效视频的代码。

import cv2
pathOut = r"C:/Users/Me/Out/"
vidcap = cv2.VideoCapture(r'C:\Me\Desktop\test.mp4');
count = 0
success = True
while success:
    success,image = vidcap.read()
    print('read a new frame:',success)
    if count%30 == 0 :
         cv2.imwrite(pathOut + 'frame%d.jpg'%count,image)
    count+=1

有了所有视频的循环,我就这样弥补了。

import os
import cv2
pathOut = r"C:/Users/Me/Out/"
count = 0
success = True
counter = 1
listing = os.listdir(r'C:/Users/Me/videos/train')
for vid in listing:
    vid = r"C:/Users/Me/videos/train/"+vid
    cap = cv2.VideoCapture(vid)
    count = 0
    counter += 1
    while success:
        success,image = cap.read()
        print('read a new frame:',success)
        if count%30 == 0 :
             cv2.imwrite(pathOut + 'frame%d.jpg'%count,image)
        count+=1

我的vid循环似乎不起作用,因为它仅拍摄一个视频。然后它声明为false,可能是因为没有剩余的帧,但是我不知道如何将其向前推送到下一个视频。我想我需要进行一些细微的调整,有人知道到底是什么吗?

2 个答案:

答案 0 :(得分:1)

这似乎是一个较小的逻辑错误:一旦第一个视频将成功设置为false,就永远不会再次将其设置为true,并且随后所有视频的while循环都将被跳过。尝试将程序更改为:

import os
import cv2
pathOut = r"C:/Users/Me/Out/"
count = 0
counter = 1
listing = os.listdir(r'C:/Users/Me/videos/train')
for vid in listing:
    vid = r"C:/Users/Me/videos/train/"+vid
    cap = cv2.VideoCapture(vid)
    count = 0
    counter += 1
    success = True
    while success:
        success,image = cap.read()
        print('read a new frame:',success)
        if count%30 == 0 :
             cv2.imwrite(pathOut + 'frame%d.jpg'%count,image)
        count+=1

答案 1 :(得分:1)

只要指定的目录中只有视频类型的文件,而没有其他任何类型的文件,这应该可以工作(注意:没有正则表达式可以选择具有特定扩展名的文件。)

附加说明:没有足够的声誉来添加评论,因此将其添加为答案。

vid = r"C:/Users/Me/videos/train/"+vid有什么需要? 您是要附加文件名和目录名吗?如果是,请尝试os.path.join