【问题标题】:Extracting frames every second of all videos in folder每秒提取文件夹中所有视频的帧
【发布时间】:2018-12-30 15:32:35
【问题描述】:

我正在尝试每秒提取一帧视频,同时在一个文件夹中有多个视频。我让它适用于这样的 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

我的视频循环似乎不起作用,因为它只拍摄一个视频。然后它状态为假,可能是因为没有剩余帧,但我不知道如何将其推到下一个视频。我想我需要做一些小调整,有人知道具体是什么吗?

【问题讨论】:

    标签: python loops opencv ffmpeg frames


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢,我会调整为path.join!
    【解决方案2】:

    这似乎是一个小的逻辑错误:一旦第一个视频将成功设置为 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
    

    【讨论】:

    • 谢谢,我会在几个小时内试试这个,但你说的很有道理!你会从我这里回来的!
    • 有效!唯一的问题是它不断地覆盖自己,因为例如 frame1.jpg 被创建了多次。我在考虑不仅要添加计数,还要添加计数器。任何线索如何点缀他的?
    • cv2.imwrite(pathOut + 'frame%d%d.jpg'%count%counter ,image)。我试过了,但这样做可能是错误的
    • 解决了:cv2.imwrite(pathOut + 'video%d'%counter + 'frame%d.jpg'%count ,image)
    猜你喜欢
    • 2020-07-20
    • 2022-12-03
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2020-08-24
    相关资源
    最近更新 更多