Мне нужен скрипт python для выбора всех файлов AVI - PullRequest
0 голосов
/ 27 января 2020

Идея заключается в следующем: сценарию необходимо рекурсивно распознать все файлы DAV в папке и применить преобразование в JPEG за 5 секунд с помощью OPENCV. Пока все работает. Однако скрипт перечисляет файлы 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

Ответы [ 2 ]

0 голосов
/ 28 января 2020

Я так понял, я пробовал с двумя вариантами, но во всех или ошибка была одинаковая: не нужно делать _Stuff (f)

введите описание изображения здесь

0 голосов
/ 27 января 2020

Проблема с вашим кодом в том, что строки, которые используют f, vidcap, et c. находятся за пределами l oop, поэтому не будут меняться каждый раз. Вам необходимо изменить структуру так, чтобы f, sec, count и vidcap менялись с каждой итерацией l oop. Вам также следует стараться избегать функций, слишком полагающихся на глобальные переменные, так как становится все труднее узнать, какими будут их значения во время выполнения функции - обычно вместо этого значения должны передаваться в функцию в качестве параметров. Вот несколько возможных способов реорганизации кода:

...

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)
...