尝试将帧转换为带有子文件夹的多个文件夹中的视频

Trying to convert frames into videos from multiple folder with subfolders

我有一个根文件夹,其中包含多个文件夹,有些文件夹里面有 png,有些文件夹里面有子文件夹和 png。

我的代码:

import os
import cv2

root = r'C:\Users\sboroghina\Documents\_projects\json_compare'



for videopath, videodirs, videofiles in os.walk(root, topdown=False):
    for videoname in videodirs:
        if len(videoname) > 40:
            video_name = str(videoname) + '.avi'


            for path, dirs, files in os.walk(root, topdown=False):
                image_folder = path
                images = [f for f in os.listdir(image_folder) if f.endswith('.png')]
                frame = cv2.imread(os.path.join(image_folder, images[0]))
                height, width, layers = frame.shape
                video = cv2.VideoWriter(video_name, 0, 30, (width, height))


                for image in images:
                    video.write(cv2.imread(os.path.join(image_folder, image)))
                    cv2.destroyAllWindows()
                    video.release()

我收到这个错误:

Traceback (most recent call last):
  File "C:\Users\sboroghina\Documents\_projects\generate_annotation_images\test2.py", line 20, in <module>
    frame = cv2.imread(os.path.join(image_folder, images[0]))
IndexError: list index out of range

我不明白为什么会出现这个错误。

您像这样定义了 images 变量:

images = [f for f in os.listdir(image_folder) if f.endswith('.png')]

之后,在没有任何验证的情况下,您做了:

images[0]

现在,当 images 是一个空列表时,这可能会导致问题,这意味着 os.listdir(image_folder) 中列出的文件中的 none 以 ".png' 结尾。

只需更改此代码块:

            for path, dirs, files in os.walk(root, topdown=False):
                image_folder = path
                images = [f for f in os.listdir(image_folder) if f.endswith('.png')]
                frame = cv2.imread(os.path.join(image_folder, images[0]))
                height, width, layers = frame.shape
                video = cv2.VideoWriter(video_name, 0, 30, (width, height))

                for image in images:
                    video.write(cv2.imread(os.path.join(image_folder, image)))
                    cv2.destroyAllWindows()
                    video.release()

至:

            for path, dirs, files in os.walk(root, topdown=False):
                image_folder = path
                images = [f for f in os.listdir(image_folder) if f.endswith('.png')]
                if images: # Validation
                    frame = cv2.imread(os.path.join(image_folder, images[0]))
                    height, width, layers = frame.shape
                    video = cv2.VideoWriter(video_name, 0, 30, (width, height))

                    for image in images:
                        video.write(cv2.imread(os.path.join(image_folder, image)))
                    cv2.destroyAllWindows() # Unindented
                    video.release()

请注意,我还取消了这些行的缩进一次:

                    cv2.destroyAllWindows()
                    video.release()

这样 VideoWriter 对象在所有帧都写入后才会被释放。