Matlab: сохранить кадры изображения как видео YCbCr

Итак, у меня есть 10 отдельных кадров изображения формата YCbCr. Как я могу экспортировать его как видео YCbCr в Matlab, чтобы его можно было просматривать через поддерживаемый видеоплеер?

Обновление-1

      for Frame_Index = 1: frames
    YCbCr_Movie_Structure_Array(Frame_Index).cdata = uint8(images(Frame_Index));
end

Я получаю сообщение об ошибке: Преобразование в uint8 из ячейки невозможно.

1 ответ

Экспонирование кадров в видеофайл

Не уверен, хотите ли вы сохранить кадры в цветовом пространстве YCbCr, но если это так... Один из способов - сохранить все отдельные кадры в структуру, которая имеет поля/члены 'cdata'а также 'colormap'. После циклического просмотра кадров и сохранения их в структуру структуру можно экспортировать в видеофайл. Чтобы экспортировать видео в файл, необходимо сначала создать видеообъект с помощью VideoWriter()функция. Затем вся структура может быть записана в видеообъект и транзитивно в файл с помощью WriteVideo()функция. Полезно иметь в виду open()а также close()объект видео перед выполнением любого чтения и записи из этого объекта аналогично тому, как обрабатываются текстовые файлы. В приведенном ниже примере видео экспортируется в .mp4файл. Частоту кадров и качество можно настроить в свойствах точки. .FrameRateа также .Qualityсоответственно.

Способ 1: Использование структуры → Видеообъект (файл)

      %Creating 10 test images/frames%
Frame_1 = randi(255,[400 400 3]);
Frame_2 = randi(255,[400 400 3]);
Frame_3 = randi(255,[400 400 3]);
Frame_4 = randi(255,[400 400 3]);
Frame_5 = randi(255,[400 400 3]);
Frame_6 = randi(255,[400 400 3]);
Frame_7 = randi(255,[400 400 3]);
Frame_8 = randi(255,[400 400 3]);
Frame_9 = randi(255,[400 400 3]);
Frame_10 = randi(255,[400 400 3]);

Number_Of_Frames = 10;
[Video_Height,Video_Width,Number_Of_Channels] = size(Frame_1);

%Creating a matrix with dimensions of the video with three channels%
Colour_Channel_Matrix = zeros(Video_Height,Video_Width,3,'uint8');

%Creating a video structure to hold all the frames%
YCbCr_Movie_Structure_Array = struct('cdata',Colour_Channel_Matrix, 'colormap', []);

%Scanning the frames into the video structure%
for Frame_Index = 1: Number_Of_Frames
    YCbCr_Movie_Structure_Array(Frame_Index).cdata = uint8(eval("Frame_" + num2str(Frame_Index)));
end

%Creating a video object to save the video structure to%
Video_Object = VideoWriter('Saved_Video.mp4','MPEG-4'); 
Video_Object.FrameRate = 30; 
Video_Object.Quality = 100;
open(Video_Object);

writeVideo(Video_Object,YCbCr_Movie_Structure_Array);
close(Video_Object);

Способ 2: непосредственно в видеообъект (файл)

Этот метод намного быстрее, но теряет некоторую гибкость в манипулировании и проверке/проверке кадров перед их записью в файл.

      %Creating 10 test images%
Frame_1 = randi(255,[400 400 3]);
Frame_2 = randi(255,[400 400 3]);
Frame_3 = randi(255,[400 400 3]);
Frame_4 = randi(255,[400 400 3]);
Frame_5 = randi(255,[400 400 3]);
Frame_6 = randi(255,[400 400 3]);
Frame_7 = randi(255,[400 400 3]);
Frame_8 = randi(255,[400 400 3]);
Frame_9 = randi(255,[400 400 3]);
Frame_10 = randi(255,[400 400 3]);

Images = {Frame_1,Frame_2,Frame_3,Frame_4,Frame_5,Frame_6,Frame_7,Frame_8,Frame_9,Frame_10};
Number_Of_Frames = length(Images);

%Creating a video object to save the video structure to%
Video_Object = VideoWriter('Saved_Video.mp4','MPEG-4'); 
Video_Object.FrameRate = 30; 
Video_Object.Quality = 100;
open(Video_Object);

%Scanning the frames into the video structure%
for Frame_Index = 1: Number_Of_Frames    
    writeVideo(Video_Object,uint8(cell2mat(Images(Frame_Index))));
end

close(Video_Object);
Другие вопросы по тегам