从工业检测系统到自动驾驶系统,计算机视觉是一个包括许多有趣应用的广泛领域。许多这样的系统在原型和实现阶段都要用到开源计算机视觉 (open source computer vision library,opencv)。opencv优化了许多功能函数,并在实时的计算机视觉程序中得到应用。但是,由于嵌入式优化策略得天独厚的优势,仍然值得大家尝试利用逻辑硬件来加速opencv的性能。
目前,opencv被广泛用于开发计算机视觉应用中。opencv包含2500多个优化的视频函数的函数库,并且专门针对台式机处理器和图形处理器(graphic processing unit,gpu)进行优化。
xilinx提供的vivado hls高层次综合工具能够通过c/c++ 编写的代码直接创建rtl硬件,显著提高设计效率;同时,xilinx zynq全可编程soc系列器件嵌入双核arm cortex-a9处理器将软件可编程能力与fpga的硬件可编程能力实现完美结合,以低功耗和低成本等系统优势实现单芯片无以伦比的系统性能、灵活性、可扩展性,加速图形处理产品设计上市时间。opencv拥有成千上万的用户,而且opencv的设计无需修改即可在 zynq器件的arm处理器上运行。但是,利用opencv实现的高清处理经常受外部存储器的限制,尤其是存储带宽会成为性能瓶颈,存储访问也限制了功耗效率。通过xilinx公司提供的vivado hls高级语言综合工具,设计者可以轻松实现opencv c++视频处理设计到rtl代码的转换,将其转换为可以在zynq实现的硬件加速器或者在fpga上实现的实时硬件视频处理单元。
1、 opencv和hls视频库
如图15.83所示,opencv在视频处理系统中可以有不同的应用方式。在图15.83(a)中,算法的设计和实现完全依赖于opencv的函数调用,利用文件的访问功能进行图片的输入、输出和处理;在图15.83(b)中,算法可以在嵌入式系统(例如zynq base trd)中实现,利用特定平台的函数调用访问输入输出图像,但是,视频处理的实现依赖于嵌入式系统中处理器(例如cortex™-a9)对opencv功能函数的调用;在图15.83(c)中,处理算法的opencv功能函数被xilinx vivado hls视频库函数替换,而opencv函数则用于访问输入和输出图像,提供视频处理算法实现的设计原型。vivado hls提供的视频库函数可以被综合,在对这些函数综合后,可以将处理程序模块整合到诸如zynq的可编程逻辑中。这样,这些程序逻辑块就可以处理由处理器生产的视频流、从文件中读取的数据、外部输入的实时视频流。
图15.83 opencv应用的不同方式
vivado hls包含大量的视频库函数,方便于构建各种各样的视频处理程序。通过可综合的c++代码,实现这些视频库函数。在视频处理功能和数据结构方面,这些综合后的代码与opencv基本对应。许多视频概念与抽象和opencv非常相似,很多图像处理模块函数和opencv库函数一致。
例如,opencv中用于代表图片的很重要的一个类便是cv::mat类,cv::mat对象定义如下:
cv::mat image(1080, 1920, cv_8uc3);
该行代码声明了一个1080×1920像素,每一个像素都是由3个8位无符号数表示的变量image。对应的hls视频库模板类hls::mat声明如下:
hls::mat image(1080, 1920);
这两行代码的参数形式、图像尺寸最大值、语法规则不同,生成的对象是相似的。如果图像规定的最大尺寸和图像的实际尺寸相同的话,也可以用下面的代码替代:
hls::mat image( );
表15.14给出了一个简单的图像转换函数应用对比(功能实现dst=src*2.0+0.0)。
表15.15和表15.16给出了opencv和hls视频库的核心结构和hls视频库。
2、axi4流和视频接口
通过axi4流协议,xilinx提供的视频处理模块实现像素数据通信。尽管底层axi4流媒体协议不需要限制图片尺寸,但是,若图片尺寸相同,则将会大大简化大部分的复杂视频处理计算。对于遵循axi4流协议的输入接口,可以保证每一帧都包含rows * cols的像素。在保证前面视频帧保持完整性和矩形性的情况下,后续模块实现对视频帧有效地处理。
如表15.17所示,vivado hls包含2个可综合的视频接口转换函数。
视频库还提供了其他不可综合的视频接口函数,这些函数用于在基于opencv测试平台与综合后的函数结合。表15.18给出了不可综合的接口函数。
vivadohls视频处理函数库使用hls::mat数据类型,这种类型用于模型化视频像素流处理,实质等同于hls::steam流的类型,而不是opencv中在外部memory中存储的matrix矩阵类型。因此,在用vivado hls实现opencv的设计中,需要将输入和输出hls可综合的视频设计接口,修改为video stream接口,也就是采用hls提供的video接口可综合函数,实现axi4 video stream到vivadohls中hls::mat类型的转换。
3、 opencv到rtl代码转换的流程
opencv图像处理是基于存储器帧缓存而构建的,它总是假设视频帧数据存放在外部ddr存储器中。由于处理器的小容量高速缓存性能的限制,因此,opencv访问局部图像性能较差。并且,从性能的角度来说,基于opencv设计的架构比较复杂,功耗更高。在对分辨率或帧速率要求低,或者在更大的图像中对需要的特征或区域进行处理时,opencv似乎足以满足很多应用的要求;但是,对于高分辨率和高帧率实时处理的应用中,opencv很难满足高性能和低功耗的需求。
基于视频流的架构能提供高性能和低功耗,链条化的图像处理函数减少了外部存储器访问。针对视频优化的行缓存和窗口缓存比处理器高速缓存更简单高效,更易于使用xilinx提供的vivado hls 在fpga器件中采用数据流优化来实现。
vivado hls对opencv的支持,不是指可以将opencv的函数库直接综合成rtl代码,而是需要将代码转换为可综合的代码。这些可综合的视频库称为vivado hls视频库,它们由vivado hls工具提供。
由于opencv函数一般都包含动态的内存分配、浮点以及假设图像在外部存储器中存放或者修改,所以不能直接通过vivado hls对opencv函数进行综合。
vivado hls视频库用于替换很多基本的 opencv函数,它与opencv具有相似的接口和算法,它主要针对在fpga架构中实现的图像处理函数,其中包含了专门面向fpga的优化,比如定点运算而非浮点运算(不必精确到比特位),片上的行缓存(line buffer)和窗口缓存(window buffer)。
下面列出了在fpga/zynq开发中使用vivadohls实现opencv的设计流程:
(1) 如图15.84所示,给出了开发opencv的应用流程。在计算机上开发opencv的应用时,由于是开源的设计,采用c++的编译器对其进行编译,仿真和调试,最后产生可执行文件。无需修改这些设计,就可以在arm内核上运行opencv应用。
图15.84 开发opencv应用
(2)如图15.85所示,使用i/o函数抽取fpga实现的部分,并且使用可综合的vivado hls 视频库函数代码来代替opencv函数的调用。
(3)运行vivado hls生成rtl代码。并且,在vivado hls工程中启动co-sim,hls工具自动重用opencv的测试激励,来验证所生成的rtl代码。在xilinx的ise/vivado开发环境中,对rtl进行集成,并且在soc/fpga中实现它们。
图15.85 opencv应用的软硬划分
小米逆势大涨34.9%,成手机市场的最大黑马
2019年半导体产业将进入商业循环对稳定的一个阶段
英特尔聚力整合实现可持续的异构计算
美国 5G 为何与 4G 相差无几?
比天价护肤品更管用,日本家用美容仪推荐
计算机视觉应用之OpenCV基础教程
芯片设计之仿真工具
iphone8什么时候上市?iphone8最新消息:iphone8给我们带来的这个四大惊喜,我们必须要知道
非接触式传感器技术有哪些新进展
天马:OLED和mini-LED在车载上应用的趋势如何?
魅族Flyme6最新消息:Flyme6厉害了三星s7Edge也适配,魅族Flyem6值得更新
黄铁军:未来二十年AI的智力或将超过人类?
DS89C430/DS89C450超高速闪存微控制器存储器接口时序
金融科技在5G到来之后该怎样发展
万有理论:物联网设备互联的“生态链”
在智能产品领域中温湿度传感器的应用
华硕RTX 3060 Ti GAMING显卡测评介绍
智能网联汽车产业发展态势如何?
8.15亿!宁德时代斩获华晨宝马电池产能建设项目订单
樱花锁业DZ-6688电子锁简介