使用将视频转换为图像的 cv2 与脚本进行循环

Making a loop with script using cv2 that converts video to images

我是使用 python 的初学者,所以这可能相对简单,但我想使用 Open CV 将我在网上找到的脚本制作成一个循环,以便它可以将整个文件夹的视频转换为图片。

当我将视频文件名输入 cv2.VideoCapture() 时,此代码运行良好,但在尝试将其定义为循环可以引用的变量名时,我遇到了 运行 问题。因此,任何有关如何正确构建循环和子例程的帮助都将非常有帮助!

import cv2
import numpy as np
import os
vidcap = cv2.VideoCapture('FS_T8_2019-01-17_02.14.52_.MP4')

def getFrame(sec):
    vidcap.set(cv2.CAP_PROP_POS_MSEC,sec*1000)
    hasFrames,image = vidcap.read()
    if hasFrames:
        cv2.imwrite("image"+str(count)+".jpg", image)     # save frame as JPG file
    return hasFrames
sec = 0
frameRate = 1 #//it will capture image in each 1 second
count=1
success = getFrame(sec)
while success:
    count = count + 1
    sec = sec + frameRate
    sec = round(sec, 2)
    success = getFrame(sec)

理想情况下,您希望将 vidcap 移动到 getFrame 函数中以将视频源作为参数获取,这样每个视频的 vidcap 都会有所不同。我遍历一个文件夹(视频)并将帧输出到另一个文件夹(输出),就像这样

import cv2
import numpy as np
import os
import sys
ROOT_DIRECTORY_PATH = sys.path[0]


def getFrame(sec, src, img_out):
    vidcap = cv2.VideoCapture(src)
    vidcap.set(cv2.CAP_PROP_POS_MSEC, sec * 1000)
    hasFrames, image = vidcap.read()
    if hasFrames:
        cv2.imwrite(img_out, image)     # save frame as JPG file
    return hasFrames

def create_frame(src, dst):
    sec = 0
    frameRate = 1  # //it will capture image in each 1 second
    count = 1
    img_out = dst + '_' + str(count) + '.jpg'
    success = getFrame(sec, src, img_out)
    while success:
        count = count + 1
        sec = sec + frameRate
        sec = round(sec, 2)
        img_out = dst + '_' + str(count) + '.jpg'
        success = getFrame(sec, src, img_out)

for mp4name in os.listdir('videos'):
    create_frame(ROOT_DIRECTORY_PATH + '/videos/' + mp4name,
                 ROOT_DIRECTORY_PATH + '/output/' + mp4name.split('.mp4')[0])