我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:双彩网 > 帧缓存器 >

Xilinx FPGAZynq设计中使用HLS实现OpenCV的开发流程

归档日期:06-01       文本归类:帧缓存器      文章编辑:爱尚语录

  ) 被广泛用于开发计算机视觉应用,它包含2500多个优化的视频函数的函数库并且专门针对台式机处理器和GPU进行优化。Xilinx高层次综合工具能够使用C/C++ 编写的代码直接创建RTL硬件,显著提高设计生产力,同时,Xilinx Zynq全可编程SoC系列器件嵌入双核ARM Cortex-A9处理器将软件可编程能力与FPGA的硬件可编程能力实现完美结合,以低功耗和低成本等系统优势实现单芯片高的系统性能、灵活性、可扩展性,加速图形处理产品设计上市时间。的设计无需修改即可在Zynq器件的ARM处理器上运行,但是利用OpenCV实现的高清处理经常受外部存储器的限制,尤其是存储带宽会成为性能瓶颈,存储访问也限制了功耗效率。使用Xilinx公司的高级语言综合工具,可以轻松实现OpenCV C++视频处理设计到RTL代码的转换,输出Zynq的硬件加速器或者直接在FPGA上实现实时硬件视频处理功能。同时,Xilinx公司的Zynq All-programmable SoC是实现嵌入式计算机视觉应用的好方法,解决了在单一处理器上实现视频处理性能低功耗高的限制,Zynq高性能可编程逻辑和嵌入式ARM内核,是一款性能功耗优化的图像处理集成式解决方案。

  OpenCV中常见的与图像操作有关的数据容器有Mat,CvMat和IplImage,这三种类型都可以代表和显示图像,但是,Mat类型侧重于计算,数学性较高。而CvMat和IplImage类型更侧重于“图像”,OpenCV对其中的图像操作(缩放、单通道提取、图像阈值操作等)进行了优化。

  在OpenCV中,Mat是一个多维的密集数据数组。可以用来处理向量和矩阵、图像、直方图等等常见的多维数据。

  Mat类型较CvMat与IplImage类型来说,有更强的矩阵运算能力,支持常见的矩阵运算。在计算密集型的应用当中,将CvMat与IplImage类型转化为Mat类型将大大减少计算时间花费。

  在openCV中,CvMat和IplImage类型更侧重于“图像”,尤其是对其中的图像操作进行一定程度的优化。OpenCV没有向量(vector)的数据结构,但当我们要表示向量时,需要用矩阵数据表示。但是,CvMat更抽象,它的元素数据类型并不仅限于基础数据类型,而且可以是任意的预定义数据类型,比如RGB或者别的多通道数据。

  在OpenCV类型关系上,我们可以说IplImage类型继承自CvMat类型,当然还包括其他的变量将之解析成图像数据。IplImage类型较之CvMat多了很多参数,比如depth和nChannels。IplImage对图像的另一种优化是变量origin原点,为了弥补这一点,OpenCV允许用户定义自己的原点设置。

  OpenCV图像处理是基于存储器帧缓存而构建的,它总是假设视频frame数据存放在外部DDR 存储器中,因此,OpenCV对于访问局部图像性能较差,因为处理器的小容量高速缓存性能不足以完成这个任务。而且出于性能考虑,基于OpenCV设计的架构比较复杂,功耗更高。在对分辨率或帧速率要求低,或者在更大的图像中对需要的特征或区域进行处理时,OpenCV似乎足以满足很多应用的要求,但对于高分辨率高帧率实时处理的场景下,OpenCV很难满足高性能和低功耗的需求。

  基于视频流的架构能提供高性能和低功耗,链条化的图像处理函数减少了外部存储器访问,针对视频优化的行缓存和窗口缓存比处理器高速缓存更简单高效,更易于使用VivadoHLS在FPGA部件中采用数据流优化来实现。

  VivadoHLS对OpenCV的支持,不是指可以将OpenCV的函数库直接综合成RTL代码,而是需要将代码转换为可综合的代码,这些可综合的视频库称为HLS视频库,由VivadoHLS提供。

  OpenCV函数不能直接通过HLS进行综合,因为OpenCV函数一般都包含动态的内存分配、浮点以及假设图像在外部存储器中存放或者修改。

  VivadoHLS视频库用于替换很多基本的OpenCV函数,它与OpenCV具有相似的接口和算法,主要针对在FPGA架构中实现的图像处理函数,包含了专门面向FPGA的优化,比如定点运算而非浮点运算(不必精确到比特位),片上的行缓存(line buffer)和窗口缓存(window buffer)。图2.1展示了在Xilinx Zynq AP SoC器件上实现视频处理的系统结构。

  1. 在计算机上开发OpenCV应用,由于是开源的设计,采用C++的编译器对其进行编译、仿真和debug,最后产生可执行文件。这些设计无需修改即可在 ARM内核上运行OpenCV应用。

  2.使用I/O函数抽取FPGA实现的部分,并且使用可综合的VivadoHLS Video库函数代码代替OpenCV函数的调用。

  我们通过快速角点的例子,说明通常用VivadoHLS实现OpenCV的流程。首先,开发基于OpenCV的快速角点算法设计,并使用基于OpenCV的测试激励仿真验证这个算法。接着,建立基于视频数据流链的OpenCV处理算法,改写前面OpenCV的通常设计,这样的改写是为了与HLS视频库处理机制相同,方便后面步骤的函数替换。最后,将改写的OpenCV设计中的函数,替换为HLS提供的相应功能的视频函数,并使用VivadoHLS综合,在Xilinx开发环境下在FPGA可编程逻辑或作为Zynq SoC硬件加速器实现。当然,这些可综合代码也可在处理器或ARM上运行。

  OpenCV函数可实现计算机视觉算法的快速原型设计,并使用VivadoHLS工具转换为RTL代码,在FPGA可编程逻辑上或者ZynqSoC逻辑上作为硬件加速器,实现高分辨率高帧率的实时视频处理。计算机视觉应用与生俱来的异构特性,使其需要软硬件相结合的实现方案,采用Vivado HLS视频库能加快OpenCV函数向FPGA或Zynq SOC全可编程架构的映射。

本文链接:http://cheffroque.com/zhenghuancunqi/2.html