如何在MATLAB中预分配存储视频处理后图像的数组?
在MATLAB中存储处理后的视频帧并生成新视频的解决方案
嘿,我完全懂你在C语言里用指针数组存帧的思路,在MATLAB里其实有几种非常贴合需求的实现方式,帮你搞定预分配存储和后续视频生成的问题:
1. 预分配三维数组(最适合固定尺寸帧的场景)
因为你的每帧都是固定的A×B尺寸(这里是128×32),最高效的方式是直接创建一个A×B×n的三维数组,把每帧作为第三维度的一个切片存储,这和C语言里连续内存块的思路类似,访问效率很高:
% 假设A=128,B=32,n是你估算的总帧数,图像是8位无符号类型(根据你的实际类型调整) frameArray = zeros(A, B, n, 'uint8'); % 逐帧处理并存储 for k = 1:n % 这里替换成你的帧读取和处理逻辑,得到processedFrame(128×32的矩阵) processedFrame = yourProcessingFunction(readFrame(videoObj)); % 将处理后的帧存入三维数组的对应位置 frameArray(:,:,k) = processedFrame; end
2. 元胞数组(类比C语言的指针数组,灵活度更高)
如果后续可能遇到帧尺寸变化的情况,或者你更习惯“数组存指针”的逻辑,MATLAB的元胞数组就是完美替代方案——每个元胞元素可以单独存储一个二维图像矩阵,就像C里的指针指向独立的数组:
% 预分配长度为n的元胞数组 frameCell = cell(1, n); % 逐帧处理并存储 for k = 1:n processedFrame = yourProcessingFunction(readFrame(videoObj)); frameCell{k} = processedFrame; % 把处理后的帧存入第k个元胞 end
3. 从存储的帧生成新视频
不管用哪种存储方式,生成视频都可以用VideoWriter工具,举个简单的例子:
% 创建VideoWriter对象,指定输出路径和格式(比如MP4) outputVideo = VideoWriter('processed_video.mp4', 'MPEG-4'); outputVideo.FrameRate = videoObj.FrameRate; % 和原视频帧率保持一致 open(outputVideo); % 写入所有帧(以三维数组为例) for k = 1:n writeVideo(outputVideo, frameArray(:,:,k)); end % 如果用元胞数组,就改成writeVideo(outputVideo, frameCell{k}); close(outputVideo);
两种存储方式的小对比
- 三维数组:内存连续,读写速度快,适合所有帧尺寸、类型统一的场景,是首选方案
- 元胞数组:更灵活,支持不同尺寸/类型的帧,但内存碎片化程度略高,适合有可变需求的场景
内容的提问来源于stack exchange,提问作者smmr
相关产品推荐
相关产品推荐

