计算机视觉应用之OpenCV基础教程
扫描二维码
随时随地手机看文章
从工业检测系统到自动驾驶系统,计算机视觉是一个包括许多有趣应用的广泛领域。许多这样的系统在原型和实现阶段都要用到开源计算机视觉 (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&TImes;1920像素,每一个像素都是由3个8位无符号数表示的变量image。对应的HLS视频库模板类hls::Mat<>声明如下:
hls::Mat<2047, 2047, HLS_8UC3> image(1080, 1920);
这两行代码的参数形式、图像尺寸最大值、语法规则不同,生成的对象是相似的。如果图像规定的最大尺寸和图像的实际尺寸相同的话,也可以用下面的代码替代:
hls::Mat<1080, 1920, HLS_8UC3> 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个可综合的视频接口转换函数。