在图像处理中,常常会遇到用matlab读取YUV数据的情况,为此,编写了一个读取YUV数据的matlab脚本
% function [y,u,v,flag] = readYuv(filename,width,height,inputFormat) % input params. % filename: readding data path % width: image width % height: image height % inputFormat: must be NV12, NV21, YUV420P or Y % % output % flag: if successed, flag = 1, otherwise flag = 0 % Y: Y data % U: U data % V: V data % % % Author: KevenLee % Contact: hudalikm@163.com % Version: V1.0 function [y,u,v,flag] = readYuv(filename,width,height,inputFormat) flag = 1; y = []; u = []; v = []; fid = fopen(filename,'rb'); if fid <= 0 flag = -1; disp('cannot open file!') return; end switch inputFormat case 'NV21' offset=0; fseek(fid,offset,'bof'); [y,count]=fread(fid,[width,height],'uint8'); y=y'; offset=width*height; fseek(fid,0,'cof'); [vu,count]=fread(fid,[width,height/2],'uint8'); vu=vu'; v=vu(:,1:2:width-1); u=vu(:,2:2:width); case 'NV12' offset=0; fseek(fid,offset,'bof'); [y,count]=fread(fid,[width,height],'uint8'); y=y'; offset=width*height; fseek(fid,0,'cof'); [vu,count]=fread(fid,[width,height/2],'uint8'); vu=vu'; u=vu(:,1:2:width-1); v=vu(:,2:2:width); case 'Y' offset=0; fseek(fid,offset,'bof'); [y,count]=fread(fid,[width,height],'uint8'); y=y'; case 'YUV420P' offset=0; fseek(fid,offset,'bof'); [y,count]=fread(fid,[width,height],'uint8'); y=y'; offset=width*height; fseek(fid,0,'cof'); [u,count]=fread(fid,[width/2,height/2],'uint8'); offset=width*height + width/2*height/2; fseek(fid,0,'cof'); [v,count]=fread(fid,[width/2,height/2],'uint8'); otherwise fclose(fid); error('cannot processing not NV21 format'); end fclose(fid); end