1、数字视频技术课内实验报告实验一:读取 YUV 视频文件2013-2014 学年第 2 学期专业: 智能科学与技术班级: 智能 1102学号: 06113052姓名: 张克娟2014 年 3 月 21 日实验一:读取 YUV 视频文件 学时安排:2 实验类别:课内实验 一、实验目的和任务熟悉 MATLAB 软件开发环境,了解 YUV 色彩模型,编写 MATLAB 程序读取 YUV格式视频文件及各分量数据。二、实验原理利用 MATLAB 图像处理工具箱中的函数,在 MATLAB 编程环境下,实现 YUV 序列图像及各分量数据的读取。三、实验内容和步骤实验内容:1 运行 MATLAB 集成开发环境,
2、 编写 MATLAB 程序读取 YUV 视频文件,对 YUV各分量进行提取、观察和比较。2 编写 RGB 和 YUV 视频文件转换程序3 课后撰写实验报告。实验步骤:()读取 YUV 格式视频并提取分量1)读取 YUV 格式文件程序如下:function YUV_ReadShow(filename,frameNumMax,formatT)if nargin=0frameNumMax = 100;formatT = qcif;filename = C:Documents and SettingsAdministratorakiyo_qcif.yuv;endswitch formatTcaseqc
3、ifH = 144; W = 176; casecifH = 288; W = 352;otherwiseH = 480;W = 720;endfor frameNum = 1:frameNumMax;Y,U,V=yuv_import(filename,W,H,1,frameNum);tmp = Y1; img1 = zeros(H+H/2,W);img1(1:H,:) = Y1;img1(H+1:end,1:W/2) = V1;img1(H+1:end,W/2+1:end) = U1;subplot(121),imshow(uint8(img1);pause(1/30); endfuncti
4、on Y,U,V=yuv_import(filename,dims,numfrm,startfrm)fid=fopen(filename,r);if (fid 0)error(File does not exist!);end;Yd = zeros(dims(1),dims(2);UVd = zeros(dims(1)/2,dims(2)/2);frelem = numel(Yd) + 2*numel(UVd);if (nargin = 4) fseek(fid,startfrm * frelem , 0);end;Y = cell(1,numfrm);U = cell(1,numfrm);V
5、 = cell(1,numfrm);for i=1:numfrmYd = fread(fid,dims(1) dims(2),uint8); Yi = Yd;UVd = fread(fid,dims(1)/2 dims(2)/2,uint8);Ui = UVd;UVd = fread(fid,dims(1)/2 dims(2)/2,uint8);Vi = UVd;end;fclose(fid);结果如下:2)分量提取程序如下:%读取 YUV 格式视频程序function yuvfname,pname=uigetfile(*.yuv;*.jqcif);%获得文件路径 FileName=fullf
6、ile(pname,fname); %选择文件FileLength=length(FileName);%判断打开的是 YUV 格式视频还是 QCIF 格式图片,并设置相应的像素大小if(FileName(FileLength-2:1:FileLength)=yuv)wide=176*2;high=144*2;endif(FileName(FileLength-3:1:FileLength)=qcif)wide=176;high=144;endFile=fopen(FileName);%打开文件framenumber=input(读取第几帧:);%从第 framenumber 帧开始读取数据fs
7、eek(File,(framenumber-1)*high*wide*3/2,bof);%读取相应分量数据Y=double(fread(File,wide,high,uint8);U=double(fread(File,wide/2,high/2,uint8);V=double(fread(File,wide/2,high/2,uint8);%显示 YUV 各图像分量figure(1);subplot(2,2,1)imshow(uint8(Y);title(第 num2str(framenumber) 帧 Y 分量图);subplot(2,2,2)imshow(uint8(U);title(第
8、 num2str(framenumber) 帧 U 分量图);subplot(2,2,3)imshow(uint8(V);title(第 num2str(framenumber) 帧 V 分量图);实验结果:(二)YUV 与 RGB 互相转换程序如下:%YUV格式与RGB格式视频相互转换程序function rgbfname,pname=uigetfile(*.yuv;*.jqcif );%获得文件路径 FileName=fullfile(pname,fname); %选择文件FileLength=length(FileName);%获取文件名长度%判断打开的是 YUV格式视频还是QCIF 格
9、式图片,并设置相应的像素大小if(FileName(FileLength-2:1:FileLength)=yuv)wide=176*2;high=144*2;endif(FileName(FileLength-3:1:FileLength)=qcif)wide=176;high=144;endFile=fopen(FileName);%打开文件picture=zeros(1.5*high,wide);framenumber=input(读取第几帧:);%从第framenumber帧开始读取数据fseek(File,(framenumber-1)*high*wide*3/2,bof);%读取相应
10、分量数据Y=double(fread(File,wide,high,uint8);U=double(fread(File,wide/2,high/2,uint8);V=double(fread(File,wide/2,high/2,uint8);%将YUV三分量图像拼接成一幅图片picture(1:high,1:wide)=Y;picture(high+1:1.5*high,1:wide/2)=U;picture(high+1:1.5*high,wide/2+1:wide)=V;Y1(1:high/2,1:wide/2)=Y(1:2:high,1:2:wide);%将Y 分量图像缩小一半%将Y
11、UV各分量图像通过公式转换为RGB各分量R = Y1 + 1.14*(V-128);G = Y1 - 0.39*(U-128) - 0.58*(V-128);B = Y1 + 2.03*(U-128);%将R,G,B各分量合成RGB图像picture1=zeros(high/2,wide/2,3);picture1(:,:,1)=R;picture1(:,:,2)=G;picture1(:,:,3)=B;RGB=uint8(cat(3,R,G,B);%图像结果显示figure(1);subplot(1,2,1);imshow(uint8(picture);title(第 num2str(framenumber) 帧YUV格式图像各分量图);subplot(1,2,2);imshow(RGB);title(第 num2str(framenumber) 帧转换为RGB图像显示);结果如下:四、注意事项和要求预先复习预习 MATLAB 图像编程知识,复习视频文件格式和各种格式转换原理。五、实验心得通过这次的实验使我对 MATLAB 软件开发环境有了更多的认识和 YUV 色彩模型,基本了解了利用 MATLAB 图像处理工具箱中的函数怎样编写 MATLAB 程序读取 YUV 格式视频文件及各分量数据。六、参考书目数字视频技术教材。