You need to enable JavaScript to run this app. 基于OpenCV将(13,222,356,3)维度numpy数组转为视频的实现方法
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.23 20:54:04