MATLAB使用writeVideo/VideoWriter导出4D数组为avi文件报错求助
问题原因
- 为什么implay可以正常播放,writeVideo报错?
implay针对MATLAB原生的视频序列格式做了兼容,会自动将H x W x 帧数的三维数组识别为单通道灰度视频序列。而writeVideo的输入格式要求更严格:单通道灰度视频序列必须是H x W x 1 x 帧数的四维数组,RGB彩色视频序列必须是H x W x 3 x 帧数的四维数组,你当前提取的subj1缺少了通道维度,所以触发格式报错。
解决方法
你只需要给提取的三维数组补充一个单通道维度,再做必要的数值类型转换,就可以正常导出avi,完整可运行代码如下:
% 提取单个受试者的三维视频数组 subj1 = data(:,:,:,1); % 补充单通道维度,适配writeVideo的格式要求 subj1_with_channel = reshape(subj1, size(subj1,1), size(subj1,2), 1, size(subj1,3)); % 转换为标准uint8灰度格式,避免导出的视频出现色阶异常 % 如果你原数组已经是uint8类型且数值范围正常,可以省略这一步 subj1_uint8 = im2uint8(mat2gray(subj1_with_channel)); % 导出avi文件 v = VideoWriter('subj1.avi'); % 可自行指定帧率,和原视频对齐即可,示例为30帧 % v.FrameRate = 30; open(v); writeVideo(v, subj1_uint8); close(v);
导出后的avi文件直接用Python OpenCV的cv2.VideoCapture('subj1.avi')即可正常遍历所有帧。
另外补充可选方案:如果你后续需要直接读取mat文件到Python,可使用scipy.io.loadmat接口直接读取原始4D数组,不需要经过avi转码也能拿到完整帧列表,之前读取失败大概率是mat文件读取方式不对,你可以根据自己的需求选择方案。
内容的提问来源于stack exchange,提问作者Macciseiono
相关产品推荐
相关产品推荐

