使用Python cv2进行视频帧拆分合成时的帧顺序异常问题求助
问题根源
你遇到的帧顺序错乱问题,是因为os.listdir()返回的文件名采用字典序排序。比如文件名frame10.jpg会排在frame2.jpg前面——字符串比较时,"1"的ASCII码小于"2",导致本该靠后的帧被提前写入视频。
修复方法
修改图片列表的排序逻辑,提取文件名中的数字部分,按数字大小升序排列,确保帧的顺序和拆分时完全一致。
修改后的完整代码
import os import cv2 import re # 用于提取文件名中的数字 # 视频文件路径设置 video_path = "video.mp4" # 打开视频文件 cap = cv2.VideoCapture(video_path) # 获取原视频FPS,避免硬编码导致播放速度不一致 fps = cap.get(cv2.CAP_PROP_FPS) # 获取视频总帧数 frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) # 图片保存路径设置 save_path = "image_data" # 确保保存目录存在,不存在则创建 os.makedirs(save_path, exist_ok=True) # 按帧拆分并保存图片 for i in range(frame_count): ret, frame = cap.read() if ret: cv2.imwrite(f"{save_path}/frame{i}.jpg", frame) else: break cap.release() # 读取保存的图片文件 image_folder = 'image_data' # 提取文件名中的数字,按数字大小升序排序 images = sorted( [img for img in os.listdir(image_folder) if img.endswith('.jpg')], key=lambda x: int(re.findall(r'\d+', x)[0]) ) # 获取单帧图片的尺寸信息 frame = cv2.imread(os.path.join(image_folder, images[0])) height, width, layers = frame.shape # 设置视频编码器 fourcc = cv2.VideoWriter_fourcc('M','J','P','G') # 创建视频写入对象 video = cv2.VideoWriter('output.avi', fourcc, fps, (width, height)) # 将图片逐帧写入合成视频 for image in images: video.write(cv2.imread(os.path.join(image_folder, image))) # 释放资源 cv2.destroyAllWindows() video.release()
额外优化点
- 新增
os.makedirs(save_path, exist_ok=True),避免因保存目录不存在导致报错 - 改用原视频的FPS参数,而非硬编码24,保证合成视频的播放速度与原视频一致
- 使用f-string格式化文件路径,代码更简洁易读
内容的提问来源于stack exchange,提问作者최지훈
相关产品推荐
相关产品推荐

