一个文件夹中有多个子文件夹,子文件夹中有多张图像。如何把批量把子文件夹中的图像合成视频,视频名称是子文件夹的名称,生成的视频保存到指定文件夹,效果记录。
代码
import os
import cv2
def create_video_from_images(image_folder, output_folder, fps=30):
# 获取子文件夹名称,这将作为视频文件的名称
video_name = os.path.basename(image_folder)
video_path = os.path.join(output_folder, f"{video_name}.mp4")
# 获取子文件夹中的所有图像文件
images = [img for img in os.listdir(image_folder) if img.endswith((".png", ".jpg", ".jpeg", ".bmp", ".tiff"))]
# 确保图像列表不为空
if not images:
print(f"No images found in {image_folder}")
return
# 对图像文件进行排序,确保它们按照正确的顺序合成视频
images.sort()
# 读取第一张图像以获取帧尺寸
frame = cv2.imread(os.path.join(image_folder, images[0]))
height, width, layers = frame.shape
# 定义编码器并创建VideoWriter对象
fourcc = cv2.VideoWriter_fourcc(*'mp4v') # 使用mp4编码
video = cv2.VideoWriter(video_path, fourcc, fps, (width, height))
# 遍历所有图像并将它们写入视频文件
for image_file in images:
image_path = os.path.join(image_folder, image_file)
video.write(cv2.imread(image_path))
# 释放VideoWriter并关闭所有窗口
video.release()
cv2.destroyAllWindows()
print(f"Video {video_path} created successfully.")
# 主函数,用于遍历主文件夹中的所有子文件夹并创建视频
def main(main_folder, output_folder):
# 确保输出文件夹存在,如果不存在则创建它
if not os.path.exists(output_folder):
os.makedirs(output_folder)
# 遍历主文件夹中的所有子文件夹
for subdir, _, files in os.walk(main_folder):
# 检查子文件夹中是否包含图像文件
if any(file.endswith((".png", ".jpg", ".jpeg", ".bmp", ".tiff")) for file in files):
create_video_from_images(subdir, output_folder)
# 设置主文件夹和输出文件夹的路径
main_folder_path = "F:/test_video/image/"
output_folder_path = "F:/test_video/video/"
# 调用主函数开始处理
main(main_folder_path, output_folder_path)
代码解释:
-
create_video_from_images 函数接收一个子文件夹路径和输出文件夹路径作为参数,用于将子文件夹中的图像合成视频。
-
在函数中,首先通过 os.path.basename 获取子文件夹的名称,这将用作视频文件的名称。然后,拼接输出视频文件的完整路径。
-
使用列表推导式查找子文件夹中的所有图像文件,并检查列表是否非空。
-
对图像文件进行排序,确保它们按照文件名顺序被读取和写入视频。
-
读取第一张图像来确定帧的尺寸,这对于创建 VideoWriter 对象是必需的。
-
定义视频编码器和创建 VideoWriter 对象。这里使用 ‘mp4v’ 编码来创建MP4格式的视频。
-
遍历子文件夹中的所有图像,并使用 VideoWriter 的 write 方法将它们写入视频文件。
-
释放 VideoWriter 对象并关闭所有OpenCV窗口。
-
main 函数遍历主文件夹中的所有子文件夹,并调用 create_video_from_images 函数来为每个子文件夹创建视频。
10 在 main 函数中,首先检查输出文件夹是否存在,如果不存在则创建它。
- 最后,设置主文件夹和输出文件夹的路径,并调用 main 函数开始处理。
效果展示
子文件夹
每个子文件夹中都有若干图像
合成视频并以子文件夹名称命名