在用CCS通过软件仿真对DSP的图像处理算法进行调试的时候,时常需要将本地的图片数据加载到数组中进行调试。需要现将图片数据转存到CCS能识别的.dat文件中,然后再用CCS加载.dat文件数据到内存中。下面一步一步的介绍。
1 将图片文件中的数据转存到.dat文件中
1.1 .dat文件的格式
其中第一行数文件头,由五部分组成:
固定标记:所有的.dat文件都是一样的
数据格式:1-十六进制 2-十进制 3-十进制长整型 4-十进制浮点型
内存地址:向内存中加载数据的时候表示内存的目的地址(可以在CCS中重新设定);将内存中的数据保存到文件中时,是数据的源地址
页类型:0-数据 1-程序
长度: 文件中数据的长度(是用十六进制表示的,如这里的9000,实际是0x9000个数据,也就是36864个)
从第二行开始,就是实际的数据了,每行代表一个数据,每个数据被加载到内存中后,占用4个Byte的内存空间。(例如图片中第二行的136,需要再内存中用一个int型数据保存)
1.2 图片数据转成.dat文件数据
这里,我们用MATLAB编写代码实现这一功能。在MATLAB2013平台上的代码如下:
clear clc [RGB,map]=imread('C:\Users\Administrator\Desktop\pictures\dog.jpg'); %读图 RGB = imresize(RGB,[96,128],'bicubic'); %图片resize成96*128 H=RGB; figure,imshow(H);%显示彩色图像 r=H(:,:,1); g=H(:,:,2); b=H(:,:,3); [M,N]=size(r); fid=fopen('H:\RPG\Code\Algorithm\ThresholdOtsu\Debug\dog.dat','wt'); %打开一个文件写入数据 fprintf(fid,'%d %d %s %d %x\n',1651,2,'8cc0',0,N*M*3); %写入二进制文件的第一行,CCS读入data数据第一行都为这种格式 %写入RGB成分 for i=1:M for j=1:N fprintf(fid,'%d\n',r(i,j)); fprintf(fid,'%d\n',g(i,j)); fprintf(fid,'%d\n',b(i,j)); end end fclose(fid);
2 CCS加载.dat文件数据
2.1 在C语言代码中开辟一段大小合适的内存。
下面是示例代码。注意:在这里直接先声明了一个int型数组和一个char型数组,int型数组用于存储.dat文件的数据,char型数组存储从int型转到char型的数据。
1 void main(void) 2 { 3 int img[36864]; 4 char img_rgb[36864]; 5 int i; 6 7 for(i = 0; i < 36864; i++) 8 { 9 img_rgb[i] = img[i]; 10 img_rgb[i] = img_rgb[i]; 11 } 12 }
2.2 编译运行代码
在simulator环境下编译运行代码,运行到代码的for循环处(注意,这是为了让img和img_rgb数组的声明动作完成,这里很重要,一定要让声明部分的代码被执行过,否则会出错)
2.3 加载.dat数据
存储用的数组被声明过后,就可以加载数据了。
1)依次点击File-Data-Load,出现下面的窗口,注意,因为dog.dat文件的数据格式是十进制整形(文件头的第二个字段为2),所以此窗口的文件类型应该选择Integer(*.dat),然后选择要加载的文件。
2)点击“打开”,出现下面的窗口,其中Address为内存中的目的地址,默认是.dat文件头的第三个字段规定的地址,可以手动更改,直接用数组名表示。在这里,要存在int型的img数组中,所以,输入img。Length是要加载数据的长度,默认是.dat文件头的第五个字段规定的长度,这里就保持默认,也可以根据实际情况更改。
3)点击“OK”,在Memory窗口下可以看到,img指向的内存处的数据已经改变成.dat文件中的数据
此时,导入已经完成,可以用img数组中的数据进行其他操作了。
2.4 以图片的形式显示数据
为了演示一下具体的效果,我们将int型的img数组中的数据转存成char型,并显示出来。
1)运行完for循环,将数据转存到char型的img_rgb数组中。
2)现在开始将img_rgb中的数据以图片的形式显示出来。依次点击View-Graph-Image,出现下面的窗口。窗口中的个参数设置如图中所示。注意:其中,因为.dat中的数据是是按照RGBRGBRBG...的形式排列的,所以相应的在内存中每3个字节就表示一个像素的RGB值。所以Index Increment是3
3)点击OK,img_rgb中的数据就能以图片的形式显示出来了
至此,在CCS3.3中,将电脑本地的图片数据加载到内存中并显示的过程全部结束。上述过程是在仿真环境下进行的,实际硬件仿真时,操作完全一样。