我需要python脚本来选择所有AVI文件

我需要python脚本来选择所有AVI文件,python,opencv,for-loop,avi,Python,Opencv,For Loop,Avi,其思想如下,脚本需要递归地识别文件夹中的所有DAV文件,并使用OPENCV将5秒的转换应用到JPEG。到目前为止一切正常。但是,脚本列出了AVI文件,但仅转换1个文件,而不是所有列出的文件 import os import cv2 path = 'C:\\Users\\coleta 1\\Desktop\\SNAPSHOT' files = [] for r, d, f in os.walk(path): for file in f: if '.avi' in fi

其思想如下,脚本需要递归地识别文件夹中的所有DAV文件,并使用OPENCV将5秒的转换应用到JPEG。到目前为止一切正常。但是,脚本列出了AVI文件,但仅转换1个文件,而不是所有列出的文件

import os
import cv2


path = 'C:\\Users\\coleta 1\\Desktop\\SNAPSHOT'

files = []
for r, d, f in os.walk(path):
    for file in f:
        if '.avi' in file:
            files.append(os.path.join(r, file))

for f in files:
    print(f)

vidcap = cv2.VideoCapture(f)
def Printar(sec):
    vidcap.set(cv2.CAP_PROP_POS_MSEC,sec*10000)
    hasFrames,image = vidcap.read()
    if hasFrames:
        cv2.imwrite("image"+str(count)+".jpg", image)   
    return hasFrames
sec = 0
frameRate = 0.5
count=1
success = Printar(sec) 
while success:
     count = count + 1
     sec = sec + frameRate
     sec = round(sec, 2)
     success = Printar(sec)
     continue

代码的问题是使用
f
vidcap
等的行在循环之外,因此不会每次更改。您需要重新构造,以便
f
sec
count
vidcap
随着循环的每次迭代而改变。您还应该尽量避免函数过于依赖全局变量,因为执行函数时很难知道它们的值是什么-通常,值应该作为参数传递给函数。重组代码的两种可能方法如下:

...

def do_stuff(path):
    print(path)
    vidcap = cv2.VideoCapture(path)
    frameRate = 0.5
    i = 0
    while True:
        success = printar(frameRate*i, vidcap, i+1)
        if not success:
            return  # add a return value if needed
        i += 1

def printar(sec, vidcap, count):
    vidcap.set(cv2.CAP_PROP_POS_MSEC,sec*10000)
    hasFrames,image = vidcap.read()
    if hasFrames:
        cv2.imwrite("image"+str(count)+".jpg", image)   
    return hasFrames

for f in files:
    do_stuff(f)
或者可能更简单更好:

from itertools import count
...

def do_stuff(path):
    vidcap = cv2.VideoCapture(path)
    frameRate = 0.5
    for i in count():
        vidcap.set(cv2.CAP_PROP_POS_MSEC, i * frameRate * 10000)
        has_frames, image = vidcap.read()
        if has_frames:
            cv2.imwrite("image{}.jpg".format(i+1), image) 
        else:
            return

for f in files:
    print(f)
    do_stuff(f)

我明白,我尝试了两种选择,但总的来说,错误是一样的:没有必要做(f)


我明白,我尝试了两种选择,但在所有或所有情况下,错误都是一样的:不需要做任何事情(f)。我用错误图像更新了问题。对不起,我已编辑了它<需要在调用代码>do_stuff之前对其进行定义。