基于BeagleBoard嵌入式处理器的系统开发CCS下基于OpenCV算法库的移植及应用方法2012/11/16美国德州仪器1基于BeagleBoard嵌入式处理器的系统开发主要内容我们将了解到:OpenCv的简介OpenCv算法库的移植OpenCv库文件的使用2012/11/16美国德州仪器2基于BeagleBoard嵌入式处理器的系统开发OpenCvOpenCv:开放计算机视觉库(OpenSourceComputerVisionLibrary),是Intel资助的开源计算机视觉库。采用C/C++编写,可以运行在Linux/Windows等操作系统上,此外,还提供了matlab等其它语言的接口。OpenCv由一系列的C函数和少量的C++类构成,实现了图像处理和计算机视觉的很多通用算法。其目标在于构建一个简单已用的计算机视觉框架,以帮助开发人员更便携的设计更复杂的计算机视觉相关的应用程序。2012/11/16美国德州仪器3基于BeagleBoard嵌入式处理器的系统开发OpenCv实现的功能对图像数据的操作,包括分配、释放、复制和转换数据。对图像和视频的输入输出,指文件和摄像头作为输入,图像和视频文件作为输出。可对各种动态数据,如列表、队列、集合、树和图等进行操作。具有基本的数字图像处理能力,可进行滤波、边缘检测、角点检测、色彩空间转换、形态学操作、采样与差值、直方图和图像金字塔等操作。可对各种结构进行分析,包括连接部件分析、轮廓处理、距离变换、各种矩的计算、模板匹配、Hough变换、多边形逼近、直线拟合、椭圆拟合和Delaunay三角划分等。对摄像头的定标,包括发现与跟踪定标模式、定标、基本矩阵估计、齐次矩阵估计和立体对应。对运动的分析,如对光流、运动分割和跟踪的分析。对目标的识别,可采用特征法和隐马尔科夫模型(HMM)法。具有基本的GUI功能,包括图像与视频显示、键盘和鼠标事件处理及滚动条等。可对图像进行标注,还可以在图片中书写文字。2012/11/16美国德州仪器4基于BeagleBoard嵌入式处理器的系统开发OpenCv的结构OpenCv主体分为五个模块,其中四个模块如下图所示。CV模块包含基本的图像处理函数和高级的计算机视觉算法;MLL是机器学习库,包含一些基于统计的分类和聚类工具;HightGUI包含图像和视频输入/输出的函数;CXCore包含OpenCv的一些基本数据结构和相关函数。2012/11/16美国德州仪器5基于BeagleBoard嵌入式处理器的系统开发OpenCv的结构第五个模块是CvAux模块,该模块中一般存放一些即将被淘汰的算法和函数,同时还有一些新出现的实验性的算法和函数。CvAux包含以下一些内容:一维和二维的隐马尔可夫模型基于轮廓线的形状匹配3D跟踪寻找场景中物体的骨架(中心线)前景/背景分割视频监控摄像机标定的C++类上述特性可能合并到CV模块中,也可能留在该模块中。2012/11/16美国德州仪器6基于BeagleBoard嵌入式处理器的系统开发OpenCv——显示图像OpenCv可以读取各种类型的图像,包括BMP、DIB、JPEG、PNG、PBM等。#includehighgui.hintmain(intargc,char**argv){IplImage*image=cvLoadImage(argv[1]);//读入一张图片if(NULL==image)//如果读入失败,退出程序exit(1);cvNamedWindow(Example,CV_WINDOW_AUTOSIZE);//创建一个窗口,标题为ExamplecvShowImage(Example,image);//在窗口Example中显示图片imagecvWaitKey(0);//暂停程序,等待用户触发一个按键cvReleaseImage(&image);//释放图像所分配的内存cvDestroyWindow(Example);//销毁窗口return0;}2012/11/16美国德州仪器7基于BeagleBoard嵌入式处理器的系统开发使用MicrosoftVisualStudio2008运行的有窗体的结果2012/11/16美国德州仪器8基于BeagleBoard嵌入式处理器的系统开发IplImage结构typedefstruct_IplImage{intnSize;/*IplImage大小*/intID;/*版本(=0)*/intnChannels;/*大多数OPENCV函数支持1,2,3或4个通道*/intalphaChannel;/*被OpenCV忽略*/intdepth;/*像素的位深度*/charcolorModel[4];/*被OpenCV忽略*/charchannelSeq[4];/*同上*/intdataOrder;/*0-交叉存取颜色通道,1-分开的颜色通道*/intorigin;/*0-顶—左结构,1-底—左结构(Windowsbitmaps风格)*/intalign;/*图像行排列(4or8).OpenCV忽略它,使用widthStep代替*/intwidth;/*图像宽像素数*/intheight;/*图像高像素数*/struct_IplROI*roi;/*图像感兴趣区域.非空只对该区域进行处理*/struct_IplImage*maskROI;/*在OpenCV中必须置NULL*/void*imageId;/*同上*/struct_IplTileInfo*tileInfo;/*同上*/intimageSize;/*图像数据大小*/char*imageData;/*指向排列的图像数据*/intwidthStep;/*排列的图像行大小,以字节为单位*/intBorderMode[4];/*边际结束模式,被OpenCV忽略*/intBorderConst[4];/*同上*/char*imageDataOrigin;/*指针指向一个不同的图像数据结构*/}IplImage;2012/11/16美国德州仪器9基于BeagleBoard嵌入式处理器的系统开发IplImage结构元素nChannels:通道数,通常为1,2,3,4depth:代表颜色深度,主要的宏定义为:IPL_DEPTH_8U,无符号8bit整数(8u)IPL_DEPTH_8S,有符号8bit整数(8s)IPL_DEPTH_16S,有符号16bit整数(16s)IPL_DEPTH_32S,有符号32bit整数(32s)IPL_DEPTH_32F,32bit浮点数,单精度(32f)IPL_DEPTH_64F,64bit浮点数,双精度(64f)这里的颜色深度是指单个通道数据保存的变量类型,例如RGB24格式的数据,通道数为3,颜色深度为IPL_DEPTH_8U2012/11/16美国德州仪器10基于BeagleBoard嵌入式处理器的系统开发IplImage结构元素origin:可以有两种取值,IPL_ORIGIN_TL和IPL_ORIGIN_BL,分别代表图像坐标系原点在左上角或者左下角。在计算机视觉领域,一个重要的错误来源就是原点位置定义的不统一。dataOrder:两种取值,IPL_DATA_ORDER_PIXEL或者IPL_DATA_ORDER_PLANE,这个变量定义了多通道图像数据存储时颜色数据的排列方式。如果是IPL_DATA_ORDER_PIXEL。表示通道颜色数据将会是RGBRGB...的交错排列;如果是另一种取值,表明每个通道的颜色值在一起,有几个通道,就有几个“颜色平面”。2012/11/16美国德州仪器11基于BeagleBoard嵌入式处理器的系统开发OpenCv常用函数cvLoadImage():将图片文件加载至内存,通过文件名确定被加载的格式,自动分配图像数据结构所需的内存。返回一个指针,指向为数据结构IplImage所分配的内存块。cvNamedWindow():由HighGUI库提供,用于在屏幕上创建一个窗口,将被显示的图像包含于该窗口中,第一个参数指明窗口的标题;第二个参数定义了窗口的属性,一般为CV_WINDOW_AUTOSIZE,表明窗口会根据图像的实际大小自动进行拉伸或者缩放。cvShowImage():根据第一个参数指定在哪一个窗口中显示图像,第二个参数为与某一图像文件对应的IplImage*类型的指针。cvWaitKey():使程序暂停,等待用户触发一个按键操作;若该值为正数,则程序暂停一段时间,时间为整数值的毫秒单位,然后继续执行。cvReleaseImage():传递指针,释放为该图像分配的内存,执行完毕后,指针将会被置位NULL。cvDestroyWindow():关闭窗口,同时释放为该窗口所分配的所有内存2012/11/16美国德州仪器12基于BeagleBoard嵌入式处理器的系统开发EMCV简介EMCV:EmbeddedComputerVisionLibrary,嵌入式计算机视觉库,是一个可以在DM64x系列DSP上运行的计算机视觉库。从OpenCv修改而来,提供了与OpenCv完全一致的函数接口。目前进展:仅移植了IplImage、CvMat、CvSeq等基本函数结构;cvCreateImage等创建和释放图像的操作,以及contour检测等少数OpenCv的功能。2012/11/16美国德州仪器13基于BeagleBoard嵌入式处理器的系统开发OpenCv移植的重要性DM6437目前支持的视频图像处理算法库只有TI提供的ImageLIB和VLIB,而这两个库只是提供了少量基本的算法,而且应用时有很多限制条件。对于一个完整全面的应用算法开发还不能提供很好的支持。在DSP上使用OpenCv能很轻松的开发出实用的算法,如目标跟踪算法、高斯背景建模算法、模式识别算法等等。因此,将OpenCv移植到DSP上是一个创新性和具有实际应用价值的课题。将为DSP平台的各种后续应用开发提供强力支持。2012/11/16美国德州仪器14基于BeagleBoard嵌入式处理器的系统开发OpenCv算法库的移植OpenCv的五个模块中,有些模块在DM6437上是不需要的,例如HighGUI模块是图形界面模块,在DSP上是不需要的,所以需要移植的主要是两个模块:cv和cxcore,这两个模块是OpenCv中的核心算法模块和数据结构支持模块。2012/11/16美国德州仪器15建立cv工程,生成lib库文件基于BeagleBoard嵌入式处理器的系统开发OpenCv算法库的移植在工程目录下建立两个文件夹:src和include,将原OpenCv中cv和cxcore的h文件全部拷贝到include文件夹下,将原OpenCv中cv的cpp文件全部拷贝到src目录下。选择菜单上的“Project”,点击“BuildOption”,在Complier一栏中选择Preprocessor,在includesearchpath中输入工程中include目录的绝对路径。配置完成后,在工程名上右键选择“Scanallfiledependencies”,这样会将所有需要的头文件自动包含进工程。同样的方法创建cxcore工程。2012/11/16美国德州仪器16基于BeagleBoard嵌入式处理器的系统开发2012/11/16美国德州仪器17基于BeagleBoard嵌入式处理器的系统开发OpenCv算法库的移植工程创建成功后,编译工程。在编译的过程中,会出现一些问题。出错提示为:error:avalueoftype“float(*)(constfloat*,constfloat*,void*)”cannotbeassignedtoanentityoftype“CvDistanceFunction”,当出现这种情况时,需要加上强制类型转换,根据函数的定义,在函数调用时的具体参数前加上强制类