【问题标题】:I need the python script to select all AVI files我需要 python 脚本来选择所有 AVI 文件
【发布时间】:2020-05-13 05:05:31
【问题描述】:

思路如下,脚本需要递归识别文件夹中的所有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

【问题讨论】:

    标签: python opencv for-loop avi


    【解决方案1】:

    我了解,我尝试了两个选项,但总的来说还是错误相同:不需要做_Stuff(f)

    enter image description here

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我明白了,我尝试了两个选项,但总的来说还是错误相同:没有必要做_Stuff(f)。我用错误图像更新了问题。
      • 对不起,我已经编辑过了。 do_stuff 需要在调用前定义。
      猜你喜欢
      • 2020-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-25
      • 1970-01-01
      • 2019-10-04
      • 1970-01-01
      相关资源
      最近更新 更多