《Vivado设计流程分析 Vivado HLS实现OpenCV的开发流程.docx》由会员分享,可在线阅读,更多相关《Vivado设计流程分析 Vivado HLS实现OpenCV的开发流程.docx(9页珍藏版)》请在第一文库网上搜索。
1、ViVadO设计流程分析VivadoH1S实现OPenCV的开发流程HarvestGUO来源:Xi1inxDSPSpeci1ist本文通过对OPeneV中图像类型和函数处理方法的介绍,通过设计实例描述在VivadoH1S中调用OpenCV库函数实现图像处理的几个基本步骤,完成从OpenCV设计到RT1转换综合的开发流程。开源计算机视觉(OpenCV)被广泛用于开发计算机视觉应用,它包含2500多个优化的视频函数的函数库并且专门针对台式机处理港和GPU进行优化。OPenCV的用户成千上万,OPenCV的设计无需修改即可在Zync1器件的ARM处理器上运行。但是利用OPenCV实现的高清处理经常受
2、外部存储器的限制,尤其是存储带宽会成为性能瓶颈,存储访问也会限制功耗效率。使用ViVadoH1S高级语言综合工具,可以轻松实现OpenCV也视频处理设计到RT1代码的转换,输出硬件加速器或者直接在咏上实现实时视频处理功能。同时,ZynqA11-programmab1eSOC是实现燧式计算机视觉应用的极好方法,很好解决了在单一处理器上实现视频处理性能低功耗高的限制,Zynq高性能可编程逻辑和嵌入式ARM内核,是一款功耗优化的集成式解决方案。1 OPenCV中图像IPI1mage,CvMat,Mat类型的关系和ViVadoH1S中图像his:Mat类型介绍OpenCv中常见的与图像操作有关的数据容
3、器有Mat,cvMat和Ip1Image,这三种类型都可以代表和显示图像,但是,Mat类型侧重于计算,数学性较高,openCV对Mat类型的计算也进行了优化。而CvMat和Ip1Image类型更侧重于“图像,。PenCV对其中的图像操作(缩放、单通道提取、图像阈值操作等)进行了优化。在OPenCV2.0之前,OPenCV是完全用C实现的,但是,IpHmage类型与CvMat类型的关系类似于面向对象中的继承关系。实际上,CvMat之上还有一个更抽象的基类一一CvArr,这在源代码中会常见。1. 1OpenCV中Mat类型:矩阵类型(Matrix)0在OPenCV中,Mat是一个多维的密集数据数组
4、。可以用来处理向量和矩阵、图像、直方图等等常见的多维数据。Mat有3个重要的方法:1、Matmat=imread(constString*fi1ename);读取图像2、imshow(conststringframeName,InputArraymat);显示图像3、imwrite(conststring&fi1ename,InputArrayimg);储存图像Mat类型较CVMat与IP11mage类型来说,有更强的矩阵运算能力,支持常见的矩阵运算。在计算密集型的应用当中,将CVMat与IPI1mage类型转化为Mat类型将大大减少计算时间花费。1.2OpenCV中CVMat类型与IPIIm
5、age类型:“图像”类型在openCV中,Mat类型与CvMat和Ip1Image类型都可以代表和显示图像,但是,Mat类型侧重于计算,数学性较高,openCV对Mat类型的计算也进行了优化。而CVMat和IPI1mage类型更侧重于“图像,OPenCV对其中的图像操作(缩放、单通道提取、图像阈值操作等)进行了优化。补充:Ip1Image由CvMat派生,而CvMat由CvArr派生即CvArr-CvMat-Ip1ImageCvArr用作函数的参数,无论传入的是CvMat或Ip1Image,内部都是按CvMat处理。在OPerICV中,没有向量(vector)的数据结构。任何时候,但我们要表示
6、向量时,用矩阵数据表示即可。但是,CvMat类型与我们在线性代数课程上学的向量概念相比,更抽象,比如CVMat的元素数据类型并不仅限于基础数据类型,比如,下面创建一个二维数据矩阵:CvMat*CvCreatMat(introws,intco1s,inttype);这里的type可以是任意的预定义数据类型,比如RGB或者别的多通道数据。这样我们便可以在一个CVMat矩阵上表示丰富多彩的图像了。1. 3OpenCV中IP1Image类型在OpenCV类型关系上,我们可以说Ip1Image类型继承自CvMat类型,当然还包括其他的变量将之解析成图像数据。IPIImage类型较之CVMat多了很多参数
7、,比如depth和nChanne1s。在普通的矩阵类型当中,通常深度和通道数被同时表示,如用32位表示RGB+A1pha.但是,在图像处理中,我们往往将深度与通道数分开处理,这样做是OPenCV对图像表示的一种优化方案。IpHmage的对图像的另一种优化是变量生igin一原点。在计算机视觉处理上,一个重要的不便是对原点的定义不清楚,图像来源,编码格式,甚至操作系统都会对原地的选取产生影响。为了弥补这一点,。PenCV允许用户定义自己的原点设置。取值0表示原点位于图片左上角,1表示左下角。1. 4ViVadoH1S中图像数据类型his:MatViVadoH1S视频处理函数库使用his:Mat数据
8、类型,这种类型用于模型化视频像素流处理,实质等同于his:steam流的类型,而不是OpenCV中在外部memory中存储的matrix矩阵类型。因此,在H1S实现OpenCV的设计中,需要将输入和输出H1S可综合的视频设计接旦,修改为VieIeoStream接口,也就是采用H1S提供的VideO接口可综合函数,实现AXI4videoStreanI到ViVadoH1S中his:Mat类型的转换。2使用VivadoII1S实现OpenCV到RT1代码转换的流程2. 1OPenCV设计中的权衡OpenCV图像处理是基于存储器帧缓存而构建的,它总是假设视频frame数据存放在外部颐存储器中,因此,O
9、PeneV对于访问局部图像性能较差,因为处理器的小容量高速缓存性能不足以完成这个任务。而且出于性能考虑,基于OPeneV设计的架构比较复杂,功耗更高。在对分辨率或帧速率要求低,或者在更大的图像中对需要的特征或区域进行处理是,OpenCV似乎足以满足很多应用的要求,但对于高分辨率高帧率实时处理的场景下,OPeneV很难满足高性能和低功耗的需求。基于视频流的架构能提供高性能和低功耗,链条化的图像处理函数能减少外部存储器访问,针对视频优化的行缓存和窗口缓存比处理器高速缓存更简单,更易于用FPGA部件,使用ViVacIoH1S中的数据流优化来实现。VivadoH1S对OpenCV的支持,不是指可以将O
10、penCV的函数库直接综合成RT1代码,而是需要将代码转换为可综合的代码,这些可综合的视频库称为H1S视频库,由VivadoH1S提供。OpenCV函数不能直接通过H1S进行综合,因为OpenCV函数一般都包含动态的内存分配、浮点以及假设图像在外部存储器中存放或者修改。ViVadOH1S视频库用于替换很多基本的OPenCV函数,它与OPeneV具有相似的接口和算法,主要针对在FPGA架构中实现的图像处理函数,包含了专门面向FPGA的优化,比如定点运算而非浮点运算(不必精确到比特位),片上的行缓存(Iinebuffer)和窗口缓存(WindOWbuffer)。2.2VivadoI11S实现Ope
11、nCV设计流程介绍使用VivadoH1S实现OpenCV的开发,主要的三个步骤如下:在计算机上开发OPCr)CV应用,由于是开源的设计,采用C+的编译器对其进行编译,位宴和debug,最后产生可执行文件。这些设计无需修改即可在ARM内核上运行OpenCV应用。使用I/O函数抽取FPGA实现的部分,并且使用可综合的ViVadoH1SVideo库函数代码代替OpenCV函数的调用。运行H1S生成RT1代码,在ViVadoH1S工程中启动co-sim,重用openCV的测试激励验证产生的RT1代码。在ISE或者Vivado开发环境中做RT1的集成和SOC/FPGA实现。2.2.1VivadoH1S视
12、频库函数H1S视频库是包含在his命名空间内的C+代码。inc1ude“h1s_video.h”与OPenCV等具有相似的接口和等效的行为,例如:OPenCV库:cvSca1e(src,dst,sca1e,shift);H1S视频库:his:ca1e。(src,dst,sca1e,shift);一些构造函数具有类似的或替代性的模板参数,例如:OPenCV库:cv:Matmat(rowsco1s,CV8UC3);H1S视频库:his:Matmat(rows,co1s);ROWS和CO1S指定处理的最大图像尺寸表2.2.1VivadoH1S视频处理函数库2.2.2VivadH1S实现OpenCV设
13、计的局限性首先,必须用H1S视频库函数代替OpenCV调用。其次,不支持OPenCV通过指针访问帧缓存,可以在H1S中使用VDMA和AXIStreamadpater函数代替。再者,不支持OPenCV的随机访问。H1S对于读取超过一次的数据必须进行复制,更多的例子可以参见见his:up1icateO函数。最后,不支持OPenCVS的In-PI型e更新,比如CvRectang1e(img,point1,point2)。下面表格2.2.2列举了OpenCV中随机访问一帧图像处理对应H1S视频库的实现方法。OpenCVH1S视频库读操作ix-cvmat.at(i,j)pix-cvGet2D(cv_im
14、g,i,j)h1s_imgpix写操作cv_mat.at(i,j)=pixcvSet2D(cv_img,i,j,pix)h1s_imgpix表2.2.2OpenCV和H1S中对一帧图像像素访问对应方法OpenCVHZ5视频库读操作pix=cv_mot.at(i,j)pix=cvGet2D(cv-img,i,j)h1s_imgpix写操作cv_matat(i,j)=pixcvSet2D(cv_img,i,j,pix)h1s_imgpix2.3用H1S实现OPenCV应用的实例(快速角点滤波器ima父efi1ter)我们通过快速角点的例子,说明通常用ViVadoH1S实现OPerICV的流程。首先
15、,开发基于OPenCV的快速角点算法设计,并使用基于OPenCV的测试激励仿真验证这个算法。接着,建立基于视频数据流链的OPenCV处理算法,改写前面直觉的OPenCV的通常设计,这样的改写是为了与H1S视频库处理机制相同,方便后面步骤的函数替换。最后,将改写的OPenCV设计中的函数,替换为H1S提供的相应功能的视频函数,并用ViVadOH1S综合,最后在Xi1inX开发环境下实现。当然,这些可综合代码也可在处理器或ARM上运行。2.3.1设计基于OpenCV的视频滤波器设计和测试激励在这个例子中,首先设计开发完全调用OPer1CV库函数的快速角点滤波器设计opencv_image_fi1ter.cpp和这个滤波器的测试激励opencv_image_fi1ter_tb.cpp,测试激励用于仿真验证opencv_image_fi1ter算法功金。算法和测京激励设计代码如下:voidopencv_image_fiIter(Ip1Image*src,Ip1Image*dst)Ip1Image*gray-CvCreateImage(CvGetSize(src),8,1);std:vectorkeypoints;cv:Matgray_mat(gray,0);CvCvtCo1or(src,gray,CV_BGR2GRAY);cv:FAST(gray_mat,keypoints,20,t