如何在matlab中将3D数组直接转换为视频

How to convert a 3D array directly to a video in matlab

我有一个维度为 600x600x28 的 3D 矩阵,最后一个索引是帧数,我想将其转换为视频文件。正如您在下面的代码中看到的,我将数组转换为大小为 600X600X3X28 的 4D 矩阵,以使其与 WriteVideo 格式兼容。但我不确定为什么输出视频是空的!

Orig = randi([1 1000],600,600,28);

x = uint8(255 * mat2gray(Orig));
map=jet;

for i=1:size(x,3)
x_all(:,:,:,i) = ind2rgb(x(:,:,i),map);
end

x_all = uint8(x_all);
v = VideoWriter('myvideo');
open(v);
writeVideo(v,x_all);
close(v)

您不必将视频转换为 RGB,您可以创建灰度视频。

示例:

x = randi([0, 255], 600, 600, 28, 'uint8');
v = VideoWriter('myvideo_grayscale.avi', 'Grayscale AVI');
open(v);
writeVideo(v, x);
close(v)

您获得黑色视频的原因是 ind2rgb returns 值在 [0, 1] 范围内并且转换为 uint8 时:x_all = uint8(x_all);,所有值是 0s 和 1s(而不是范围 [0, 255])。

创建彩色视频的示例:

Orig = randi([1 1000],600,600,28);

x = im2uint8(mat2gray(Orig));

map = jet(256); % Use colormap with 256 colors (the default is 64).

x_all = zeros(size(x, 1), size(x, 2), 3, size(x, 3), 'uint8'); % Allocate space

for i=1:size(x,3)
    x_all(:,:,:,i) = im2uint8(ind2rgb(x(:,:,i), map));
end

v = VideoWriter('myvideo.avi');
open(v);
writeVideo(v,x_all);
close(v)

如果您实际上得到的是空视频文件(不仅仅是黑色视频),则说明您的设置有问题。