基于OpenCV将(13,222,356,3)维度numpy数组转为视频的实现方法
NumPy维度视频转可播放MP4的可运行修正方案
原代码核心错误点
- 帧遍历逻辑完全错位:你的视频数组维度为(13, 222, 356, 3),对应存储顺序是*[总帧数, 单帧高度, 单帧宽度, 颜色通道数]*。原代码把宽度维度作为遍历目标、取帧的索引位置错配,会导致写入的帧数量不对、内容错乱,甚至触发数组越界报错。
- 输出分辨率硬编码不匹配:原代码手动设置的输出尺寸是(1280, 720),和你数组实际的单帧尺寸(高222、宽356)完全不符,会直接导致生成的视频花屏、无法打开。
- 色彩模式参数错配:你的单帧是3通道彩色图像,原代码给
VideoWriter最后一个参数传了False(代表写入灰度视频),会直接触发写入失败。 - 隐含的兼容问题:OpenCV的
VideoWriter默认接收BGR顺序的图像数据,绝大多数场景下NumPy存储的视频是RGB顺序,不做转换会出现画面颜色反相的问题;同时OpenCV写入要求帧数据必须是uint8类型,如果是浮点范围的数值也会写入失败。
修正后的可运行代码
import numpy as np import cv2 # 替换为你实际的视频数组变量(原代码中误写为aj的那个数组) video_arr = your_numpy_video_array # 维度校验 assert video_arr.ndim == 4 and video_arr.shape[-1] == 3, "输入数组不符合(帧数,高,宽,通道)的视频格式" # 从数组自动提取参数,避免硬编码出错 frame_count, frame_h, frame_w, _ = video_arr.shape # 可根据需求调整帧率,13帧如果要总时长2秒的话fps设为6.5即可 fps = 2 # 初始化写入器:OpenCV要求传入的分辨率顺序是(宽度, 高度) out = cv2.VideoWriter( 'output.mp4', cv2.VideoWriter_fourcc(*'mp4v'), fps, (frame_w, frame_h), isColor=True ) for i in range(frame_count): frame = video_arr[i] # 类型校验转换:确保帧数据是uint8格式 if frame.dtype != np.uint8: frame = (frame * 255).clip(0, 255).astype(np.uint8) # 通道顺序转换:RGB转BGR,若你的数组本身是BGR顺序可删除该行 frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR) out.write(frame) out.release()
实操注意事项
- 总时长 = 总帧数 / 帧率,你目前有13帧,按2fps设置生成的视频总时长约6.5秒,可根据需要调整fps参数匹配预期时长。
- 若生成的MP4在部分系统播放器打不开,可将编码换为
'XVID',输出后缀改为.avi即可兼容大多数播放器。 - 严禁手动硬写输出分辨率,必须从实际帧数组中提取宽高值,否则会出现生成文件损坏的问题。
内容的提问来源于stack exchange,提问作者Hemanth Harikrishnan
相关产品推荐
相关产品推荐

