% Generates Frames
% clc
% clear all;
% close all;
%% Resizing
%接受5个输入参数
%mov是之前读取的视频每帧数据的结构体数组
%Frame_start和Frame_end是指定要处理的视频帧范围
%Width,Height是调整后的视频宽度和高度
function A01Resize(mov,Frame_start,Frame_end,Width,Height)
FrameNo=(Frame_end - Frame_start)+1;
VideoSeq_Input=zeros(Height,Width,FrameNo);%初始化一个三维数组存储resize后的视频序列
%创建一个用于写入视频的VideoWriter对象,并打开该对象。
writerObj = VideoWriter('ToBeEncod.avi','Uncompressed AVI');
open(writerObj);
%对指定的视频帧范围进行循环处理
for i=Frame_start:Frame_end
% 据NTSC标准将RGB值按照一组系数加权求和,得到灰度值矩阵I
% 将处理后的灰度图像矩阵I存储到VideoSeq_Input对应位置上
% 将灰度图像写入writerObj对象,用于生成新的视频文件。
I= .2989*mov(1,i).cdata(1:Height,1:Width,1)...
+.5870*mov(1,i).cdata(1:Height,1:Width,2)...
+.1140*mov(1,i).cdata(1:Height,1:Width,3);
VideoSeq_Input(:,:,i)=I;
writeVideo(writerObj,I);
% VideoSeq_mov(1,i).cdata=I;
end
close(writerObj);
%关闭writerObj对象,并将VideoSeq_Input保存为MAT文件。
save('01ResizedFrames.mat','VideoSeq_Input');
%读取新生成的视频文件,并将视频的每一帧数据存储到结构体数组VideoSeq_mov中。
VideoSeq_Obj = VideoReader('ToBeEncod.avi');
nFrames = VideoSeq_Obj.NumberOfFrames;
vidHeight = VideoSeq_Obj.Height;
vidWidth = VideoSeq_Obj.Width;
% Preallocate movie structure.
VideoSeq_mov(1:nFrames) = ...
struct('cdata', zeros(vidHeight, vidWidth, 3, 'uint8'),...
'colormap', []);
% Read one frame at a time.
for k = 1 : nFrames
VideoSeq_mov(k).cdata = read(VideoSeq_Obj, k);
end
hf = figure;
set(hf, 'position', [150 150 Width Height])
% Play back the movie once at the video's frame rate.
movie(hf, VideoSeq_mov, 1, VideoSeq_Obj.FrameRate);
在resize
函数中进行压缩编码的部分,主要针对视频的帧进行处理,通常会对Y分量进行压缩。而对于彩色图像,一般需要将RGB图像转换为YUV图像,然后再对Y分量进行处理。
YUV是一种表示彩色图像的颜色空间,它分为亮度(Y)和色度(U、V)三个分量。其中,Y分量代表图像的亮度信息,而U和V分量代表色度信息。
在图像处理中,通常会将彩色图像转换为YUV图像,再对Y分量进行处理,可以更好地实现图像压缩和编码。转换为YUV之后,可以通过对Y分量进行处理(如降低分辨率、压缩、编码等)来减少数据量,同时尽可能地保留图像的信息和质量。
具体的YUV转换可以通过不同的算法和转换公式实现,例如常见的转换方法是使用以下公式:
Y = 0.299 * R + 0.587 * G + 0.114 * B
U = -0.14713 * R - 0.28886 * G + 0.436 * B
V = 0.615 * R - 0.51498 * G - 0.10001 * B