6.4.3 图像数据转换与CCS图像显示实验本节以利用CCS实现图像显示为例,进一步学习CCS的图形显示(Graph)调试技术,同时提供图像数据的转换方法。
为了方便起见,本实验将6.4.2中的volume目录下的文件稍加修改。
目标板仍为TMS320C64xx Simulator。
1.修改volume目录下的工程文件假定CCS安装在C:\CCStudio_v3.3目录下。
(1)将C:\CCStudio_v3.3\tutorial\sim64xx\volume1文件夹拷贝到文件夹C:\CCStudio_v3.3\MyProjects下。
(2)运行CCS,并打开工程volume.pjt。
(3)将C:\CCStudio_v3.3\C6000\cgtools\lib中C64x DSP的C语言运行支持库文件rts6400.lib 添加到工程中。
(4)右击工程观察窗中volume.pjt图标,在弹出的菜单中点击“Scan All File Dependencies”命令,CCS将volume.h自动添加到volume工程中。
(5)修改volume.c文件。
打开volume.c文件,在“extern void load(unsigned int loadValue);”上一行添加如下一段代码,定义图像存储空间。
#pragma DATA_ALIGN(image, 8) // 图像每个像素数据以8字节对齐#pragma DATA_SECTION(image,".imgbuffer") //为数组image分配一个段,段名为imgbufferunsigned char image[SIZE] = { }; // SIZE大小是图像的像素个数(6) 修改volume.cmd文件。
打开volume.cmd,将其内容作如下修改:/* cmd 文件*/MEMORY{L2: o =00010000h l =000F0000hCE0: o =80000000h l =01000000h /*存放图像数据image起始地址和长度*/}SECTIONS{.cinit > CE0.text > L2.stack > L2.bss > L2.const> L2.data > L2217.far > L2.switch> L2.sysmem > L2.tables > L2.cio > L2.imgbuffer > CE0/*存放图像数据image,将image数据存放到DSP外部RAM中,即CE0, 存放起始地址为80000000h*/}2.图像数据转换图像的数据格式和DSP工程中的数据格式是不同的,因此若要在CCS中使用这些图像数据,则必须进行转换。
可以利用高级语言,如Matlab或C语言将一副图像的数据提取出来,转换成DSP可用的数据。
以下bmp2data1.m是Matlab图像数据提取和转换程序。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%bmp2data1.m%利用MATLAB将灰度或索引图像转换为十六进制数据文件Clear;clc;[filename,filepath]=uigetfile('C:\ProgramFiles\MATLAB\R2007a\work\*.bmp','Open Bmp file');%为打开bmp图像而打开一个标准对话框[X,map]= imread([filepath,filename]);%将bmp文件数据读到X中imshow(X,map);%在Matlab中显示图像X1=X';%X转秩,考虑到reshape函数转换数据的顺序,在调用reshape之前进行数据调整。
Y=reshape(X1,1,[]);%数组维数转换fid=fopen('C:\ProgramFiles\MATLAB\R2007a\work\CCSbmpdata.txt','w');%打开一个数据文件,存放待写数据。
L=length(Y);for m=1:Lfprintf(fid,'0x%s,',dec2hex(Y(m))); %向CCSbmpdata.txt中写入Y的十六进制数据endfclose(fid); %关闭fid标识的文件%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%在Matlab下运行程序bmp2data1.m,将256x256图像文件lena.bmp进行转换,生成十六进制图像数据文件CCSbmpdata.txt,数据如下。
0x8A,0x85,0x81,0x83,0x83,0x83,0x81,0x81,0x82,0x83,0x81,0 x80,0x83,0x83,0x81, …….218数据存放的是图像的各个像素,数据的个数等于图像的像素个数。
以256x256图像文件lena.bmp为例,SIZE=256x256=65536。
将CCSbmpdata.dat所有数据拷贝出来,给volume.c中的“unsigned char image[SIZE] = { };”赋值(注意将CCSbmpdata.txt数据中的最后一个“,”去掉),并将SIZE替换为65536。
3.CCS图像观察窗CCS图形观察窗包括显示数据的多种选择,用户可以使用图像图标(image graph)在CCS下查看图像处理的效果。
在“View”菜单中选择“Graph”下的“image”命令,打开图形属性对话框,查看图像属性对话框。
如图6-36所示。
图6-36 色彩空间为YUV时的图形属性对话框如果定义正确,采集缓冲区和显示缓冲区中将含有完整的图像。
当图像更新时,采集缓冲区从目标板中提取数据,显示缓冲区被采集缓冲区中的数据所覆盖。
色彩空间(Color Space)定义显示数据的方式,即YUV和RGB两种方式。
当色彩空间为YUV时,图形属性对话框窗为图6-36所示。
“YUV Ratio”选项定义Y、U和V样点(sample)之间的关系,一般有3种选择,即4:1:1(每4个水平Y样点,1个U样点和1个V样点)、4:2:2(每2个水平Y样点,1个U样点和1个V样点)和4:2:0(每2x2水平Y样点,1个U 样点和1个V样点)。
每个Y、U和V样点都使用8位表示,此下有3个域,即Y源起始地址(Start Address-Y Source)、U源起始地址(Start Address-U Source)和V源起始地址(Start Address-V Source)。
另外还有YUV值转换域(Transformation of YUV Values),将YUV转换为RGB。
转换有两个步骤,即先将YUV为Y’U’V’,然后再从Y’U’V’转换为RGB。
YUV值转换域有两个选择,“Unity(none)”(即使用单位矩阵将YUV转换Y’U’V’)和“ITU-R BT 601 (CCIR601)”(即使用CCIR601矩阵,按照ITU-R BT.601 (早期为CCIR 601)亮度将YUV转换为RGB)。
当色彩空间为RGB时,图形对话框中隔行扫描数据源“Interleaved Data Sources”选项选择为Yes或No,表明图像是否隔行扫描。
如果选择No,则图形属性对话框如图6-37(a)所示。
当选择Yes时,下方将出现“Start Address”、“Bits Per Pixel”、“Image RGB Order”选项。
“Start Address”(起始地址)代表一个具有三个隔行扫描源的缓冲器输入,这个缓冲区的隔行为1,如R0G0B0R1G1B1 ...序列代表RGB分量的流为像素0,接着是像素1。
如图6-37(b)所示。
219220(a)图像不隔行扫描(b)图像隔行扫描图6-37 色彩空间为RGB时图形属性对话框“Bits Per Pixel”(每个像素的位数)可选位数有“8 (256 Color Palette)”(256色彩调色板,每个像素有8位值,指向调色板)、“16 (6 Bits for Green)”(每个像素是2个字节的数值,其中红色5位,绿色6位,蓝色5位)、“24”(每个像素由3个字节数值,各有8位分别表示红色、绿色和蓝色)和“32”。
如果此域选择16、24或32的话,还会出现“Image RGB Order”选项,定义红黄蓝的顺序。
如果选择“8 (256 Color Palette)”,还会出现“Palette Option”选项,此选项定义了从8位像素值(palette index)到RGB色彩值的转换,可选项为“Uniform Palette of 256 Colors”、“Gray Scale of 256 Colors”和“User Defined (256 Colors)”。
如果选择“User Defined (256 Colors)”,还会出项4个选项,即“Palette Address”、“Palette Entry 4-Byte Aligned”、“Palette Entry RGB Order”和“Read Palette Once Only”。
色彩空间为RGB时,图形对话框中的隔行扫描数据源“Interleaved Data Sources”选择为“No”时,每个像素的R、G和B各个分量是为8位宽度,各个分量的值范围是0~255。
选择“No”,则还有三个图形属性选项,即“Start Address - R Source”、“Start Address - G Source”和“Start Address - B Source”。
此外,图形属性对话框中还有一些选项,如“Lines Per Display”定义了像素高度。
“Pixels Per Line”定义了像素宽度。
“Byte Packing to Fill 32 Bits”定义了目标板或simulator数据的图像压缩格式。
如果选择“No”,表示字节类型的数据流不压缩,目标板或simulator中的每个数据值是字节类型的。
如果选择“Yes”,表示字节类型的数据流压缩,每四个字节一组形成数据包。
数据包是32位无符号整型数,数据值的低字节是数据包的第一个字节。
如果选择“Yes”,还会有“Image Row 4-Byte Aligned”选项,若此选项选择“Yes”,目标板或simulator的每个图像行是4字节对齐,选择“No”表示不对齐。