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

标签 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

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

最佳答案

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

关于python - 每秒提取文件夹中所有视频的帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51474421/

相关文章:

Python 按行在数据帧上应用函数

python - 如何提交 flash 表单的数据? [Python]

python - 流程关闭

Java If 循环未执行 : Scanner

python-3.x - OpenCV的VideoWriter可以在单独的过程中编写吗?

c++ - opencv linemod抛出运行时错误

openCV:为 IplImage 添加透明度

python - 是否可以将路径传递到 fastapi 端点?

javascript - 如何循环表行以导出 CSV 中的值

python - 在Python中通过REGEX查找项目的索引