我需要python脚本来选择所有AVI文件
其思想如下,脚本需要递归地识别文件夹中的所有DAV文件,并使用OPENCV将5秒的转换应用到JPEG。到目前为止一切正常。但是,脚本列出了AVI文件,但仅转换1个文件,而不是所有列出的文件我需要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
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之前对其进行定义。