一、移植过程
移植的实现部分也就是把在PC机下经过vC++编译器编译、运行顺利的C/C++ 程序移植到DSP平台经过初步的修改,即实现iliON运行的过程。它的初步修改过程主要与以下三个方面:
(1)、C++向C语言的转化:OpenCV库中AdaBoost 人脸检测算法程序主要是C语言程序,但也有少量的c++语言的程序,并且程序都是采用.cpp格式的文件和C++的框架组成。虽然,DSP平台的CCS套件兼容C/C++,但是一般对于硬件的操作主要还是用C语言,而且C语言的可操作性和实时运行速度方面有很大的优势。这里用到的方法主要有:把class转化为struct、省略参数要补上、自定义操作要重新定义等。
(2)、用memalign函数替代realloc函数:在DSP中分配内存单元要字节对齐,这样可以快速的读和写,所以在TI公司的DSP中有专门的分配内存并字节对齐的函数memalign,这里用来替代C语言中的malloc函数,可以使语言更加贴近DSP的硬件,并且可以提高DSP的读写效率。
(3)、对一些与AdaBoost 人脸检测算法程序无关的模块剔除:OpenCV 库是一个完整、成熟的图像处理和计算机视觉技术库。本文需要移植的Cv 和Cxcore 模块中的内容十分丰富,为了移植代码的执行效率和存储空间的节省,本文去除去了与AdaBoost 人脸检测算法程序无关的所有其它模块。如稀疏矩阵的应用、光流模型等。
经过以上步骤的反复修改,移植的代码已经可以在DSP平台上运行和实现。为了更进一步提高代码的效率,很重要的步骤是移植的优化部分,主要包括算法层次的优化、定点化、C语言程序优化、内存及cache的优化等。
通过以上两个步骤的操作和优化,移植的程序可以在DSP平台高效率的运行,达到一定实际应用的要求。
二、关键模块的移植实现
本节主要讨论分类器模块的移植。在OpenCV库的AdaBoost 人脸检测算法程序在PC机上实现时,CvHaarClassifierCascade 分类器的信息是通过调用cvLaod 对cascade 的xml 文件进行解析之后得到的;这个解析的过程十分复杂,涉及到很多数据结构模块,我们没有必要把这部分逻辑移植到DSP上,一个很好的办法是把CvHaarClassifierCascade 分类器信息的镜像搬到DSP的DRAM中,这样可以直接按照分类器的结构从二进制镜像文件中读出分类器信息。
下面介绍CvHaarClassifierCascade 内存镜像的生成过程。首先,要定义CvHaarClassifierCascade 分类器的结构,如表4.1所示。结构当中有指针,这使得映射的过程变得复杂,具体就是在实现的时候,把外层的struct 写到fi1e里之后,需要调用内层struct 的写函数,直到最后到没有指针的一个结构。用代码来说明如表4.4所示。
以上程序建立了一个镜像文件cascade.map,以图4.1所示的分类器结构存储了我们要用的分类器信息。可以把cascade.map文件放到PC机中与代码同一文件下或放到DSP的DRAM中,在程序初始化是读入。读入的程序如表4.4所示,用同样的顺序调用即可,只需把write改写成read,还要注意读入时的内存分配。
三、数据传输问题
在实际移植过程中遇到dm6446 ARM端数据传输到DSP端数据出错。具体原因是ARM端地址是基于Linux 操作系统的内存管理地址,是虚拟地址;而DSP端内存地址是没有操作系统的物理地址。所有ARM端的内存地址数据要和DSP端数据通信需要将ARM端的地址转换为物理地址,可以使用Memory_getPhysicalAddress( )函数实现。