ObjectRelator-Original / scripts /create_video.py
YuqianFu's picture
Upload folder using huggingface_hub
625a17f verified
import cv2
import os
import re
import argparse
from pathlib import Path
def natural_sort_key(filename):
"""提取文件名中的数字进行自然排序"""
numbers = re.findall(r'\d+', filename)
return [int(num) for num in numbers] if numbers else [0]
def create_video_from_images(input_folder, output_path="output_video.mp4", fps=30):
"""
将文件夹中的图片按索引顺序合成视频
参数:
- input_folder: 输入图片文件夹路径
- output_path: 输出视频文件路径
- fps: 视频帧率
"""
# 支持的图片格式
image_extensions = {'.jpg', '.jpeg', '.png', '.bmp', '.tiff', '.tif'}
# 获取所有图片文件
image_files = []
for file in os.listdir(input_folder):
if Path(file).suffix.lower() in image_extensions:
image_files.append(file)
if not image_files:
print("未找到支持的图片文件!")
return False
# 按照文件名中的数字索引排序
image_files.sort(key=natural_sort_key)
print(image_files)
print(f"找到 {len(image_files)} 张图片")
print(f"第一张图片: {image_files[0]}")
print(f"最后一张图片: {image_files[-1]}")
# 读取第一张图片获取尺寸
first_image_path = os.path.join(input_folder, image_files[0])
first_image = cv2.imread(first_image_path)
if first_image is None:
print(f"无法读取图片: {first_image_path}")
return False
height, width, layers = first_image.shape
print(f"视频尺寸: {width}x{height}")
# 创建视频编写器
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
video_writer = cv2.VideoWriter(output_path, fourcc, fps, (width, height))
if not video_writer.isOpened():
print("无法创建视频文件!")
return False
# 逐帧写入视频
for i, image_file in enumerate(image_files):
image_path = os.path.join(input_folder, image_file)
image = cv2.imread(image_path)
if image is None:
print(f"跳过无效图片: {image_file}")
continue
# 确保图片尺寸一致
if image.shape[:2] != (height, width):
image = cv2.resize(image, (width, height))
video_writer.write(image)
# 显示进度
if (i + 1) % 10 == 0 or i == len(image_files) - 1:
print(f"处理进度: {i + 1}/{len(image_files)}")
# 释放资源
video_writer.release()
cv2.destroyAllWindows()
print(f"视频生成完成: {output_path}")
print(f"视频参数: {width}x{height}, {fps}fps, {len(image_files)}帧")
return True
def main():
parser = argparse.ArgumentParser(description='将图片序列合成为视频')
parser.add_argument('--input', '-i', default='.', help='输入图片文件夹路径 (默认: 当前目录)')
parser.add_argument('--output', '-o', default='output_video.mp4', help='输出视频文件路径 (默认: output_video.mp4)')
parser.add_argument('--fps', '-f', type=int, default=30, help='视频帧率 (默认: 30)')
args = parser.parse_args()
# 检查输入文件夹是否存在
if not os.path.exists(args.input):
print(f"错误: 输入文件夹不存在: {args.input}")
return
print(f"输入文件夹: {args.input}")
print(f"输出文件: {args.output}")
print(f"帧率: {args.fps}")
print("=" * 50)
# 创建视频
success = create_video_from_images(args.input, args.output, args.fps)
if success:
print("视频生成成功!")
else:
print("视频生成失败!")
if __name__ == "__main__":
main()