尝试将帧转换为带有子文件夹的多个文件夹中的视频
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
对象在所有帧都写入后才会被释放。
我有一个根文件夹,其中包含多个文件夹,有些文件夹里面有 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
对象在所有帧都写入后才会被释放。