使用matlab提取YUV文件各分量并存入txt文件

工具:

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循环对应的参数即可。
使用matlab提取YUV文件各分量并存入txt文件

上一篇:java第七次作业


下一篇:Mysql的表中含有Blob字段对性能的影响有几何?