工具:
MATLAB
思路:
1.YUV文件为视频序列文件,可以理解为很多帧图像,每一幅图像按照YUV分量进行存储像素,因此需要分别将每一帧的Y分量U分量V分量提取出来,将其存成十进制的txt格式。
2.使用MATLAB首先提取出YUV文件的每一帧的三个分量
参考链接:
链接: https://blog.csdn.net/sinat_33718563/article/details/79248012?utm_medium=distribute.pc_relevant.none-task-blog-title-10&spm=1001.2101.3001.4242.
最终存储的txt数据以每行8个像素的格式进行存储。(这个是根据学长提供的YUV分量的txt文件的格式来提取的)。(还有另外的一个格式,直接提取成一列的格式。)
代码设计(只存储前5帧数据)
%% 读取4:2:0格式YUV的Y、U和V分量,然后将三个分量分别保存为.txt格式
clear
clc
%% Read yuv from file
row=250; % 行
col=320; % 列
fnum=300; % 帧数
yuvseq = 'foreman_320_256_300_kj.yuv'; % 输入yuv序列名称,要把YUV文件放在统一路径下。
len=length(yuvseq);
yuvName=yuvseq(1:len-4);
fid = fopen(yuvseq, 'r');
rec_Y=zeros(col,row,fnum);%三维0矩阵
rec_U=zeros(col/2,row/2,fnum);
rec_V=zeros(col/2,row/2,fnum);
for f=1:fnum%一帧一帧的存入各分量
[rec_Y(:,:,f),count] = fread(fid,[col,row],'uchar');%8位,无符号字符型
[rec_U(:,:,f),count1]=fread(fid,[col/2,row/2],'uchar');
[rec_V(:,:,f),count2]=fread(fid,[col/2,row/2],'uchar');
end
filename_Y=sprintf('%s%s',yuvName,'_Y.txt'); %% 生成.txt名称
outfid_Y=fopen(filename_Y,'wb');
filename_U=sprintf('%s%s',yuvName,'_U.txt');
outfid_U=fopen(filename_U,'wb');
filename_V=sprintf('%s%s',yuvName,'_V.txt');
outfid_V=fopen(filename_V,'wb');
%存V分量
i=1;
for f=1:5
pic_V=uint8(rec_V(:,:,f)'); %% '代表转置操作
for j=1:(row/2)%行
for k=1:(col/2)%列
if(i<8)
fprintf(outfid_V,'%d\t',pic_V(j,k));
else
fprintf(outfid_V,'%d\n',pic_V(j,k));
i=0;
end
i=i+1;
end
end
end
%存Y分量txt数据
i=1;
for f=1:5
pic_Y=uint8(rec_Y(:,:,f)'); %% '代表转置操作
for j=1:row%行
for k=1:col%列
if(i<8)
fprintf(outfid_Y,'%d\t',pic_Y(j,k));
else
fprintf(outfid_Y,'%d\n',pic_Y(j,k));
i=0;
end
i=i+1;
end
end%% 将每个矩阵显示为图片
end
%存U分量
i=1;
for f=1:5
pic_U=uint8(rec_U(:,:,f)'); %% '代表转置操作
for j=1:(row/2)%行
for k=1:(col/2)%列
if(i<8)
fprintf(outfid_U,'%d\t',pic_U(j,k));
else
fprintf(outfid_U,'%d\n',pic_U(j,k));
i=0;
end
i=i+1;
end
end
end
%%
fclose(fid);
fclose(outfid_Y);
fclose(outfid_U);
fclose(outfid_V);
存储格式
如果要更换格式,只需要修改for循环对应的参数即可。