栏目分类
香港三级 Xilinx Zynq使用HLS达成OpenCV的开垦历程
发布日期:2024-10-07 13:59 点击次数:69
摘录:最初先容OpenCV中图像类型和函数处理方法香港三级,之后通过遐想实例描绘在VivadoHLS中调用OpenCV库函数达成图像处理的几个基自己手,论说从OpenCV遐想到RTL调养玄虚的开垦历程。
本文援用地址:https://www.eepw.com.cn/article/234670.htm关节词:可编程;处理器;VivadoHLS;OpenCV;Zynq AP SOC
开源盘算机视觉 (OpenCV) 被庸俗用于开垦盘算机视觉应用,它包含2500多个优化的视频函数的函数库何况有益针对台式机处理器和GPU进行优化。Xilinx VivadoHLS高级次玄虚器具大要使用C/C++ 编写的代码径直创建RTL硬件,权贵提升遐想出产力,同期,Xilinx Zynq全可编程SOC系列器件镶嵌双核ARM Cortex-A9处理器将软件可编程智力与FPGA的硬件可编程智力达成齐备连结,以低功耗和低资本等系统上风达成单芯片无以伦比的系统性能、活泼性、可扩张性,加速图形处理居品遐想上市时候。OpenCV领有千千万万的用户,而且OpenCV的遐想无需修改即可在 Zynq器件的ARM处理器上驱动,关联词行使OpenCV达成的高清处理频繁受外部存储器的扫尾,尤其是存储带宽会成为性能瓶颈,存储侦查也扫尾了功耗成果。使用Xilinx公司的VivadoHLS高级谈话玄虚器具,不错平缓达成OpenCV C++视频处理遐想到RTL代码的调养,输出Zynq的硬件加速器或者径直在FPGA上达成及时硬件视频处理功能。同期,Xiinx公司的Zynq All-programmable SoC是达成镶嵌式盘算机视觉应用的好方法,处分了在单一处理器上达成视频处感性能低功耗高的扫尾,Zynq高性能可编程逻辑和镶嵌式ARM内核,是一款性能功耗最优化的图像处理集成式处分决策。
1 OpenCV中图像IplImage, CvMat, Mat 类型的关系和VivadoHLS中图像hls::Mat类型
OpenCV中常见的与图像操作关系的数据容器有Mat,cvMat和IplImage,这三种类型皆不错代表和显现图像,关联词,Mat类型侧重于盘算,数学性较高。而CvMat和IplImage类型更侧重于“图像”,OpenCV对其中的图像操作(缩放、单通说念索取、图像阈值操作等)进行了优化。
1.1 OpenCV中的Mat矩阵类型
在OpenCV中,Mat是一个多维的密集数据数组。不错用来处理向量和矩阵、图像、直方图等等常见的多维数据。
Mat类型较CvMat与IplImage类型来说,有更强的矩阵运算智力,撑捏常见的矩阵运算。在盘算密集型的应用当中,将CvMat与IplImage类型转动为Mat类型将大大减少盘算时候豪侈。
1.2 OpenCV中的CvMat与IplImage类型
在openCV中,CvMat和IplImage类型更侧重于“图像”,尤其是对其中的图像操作进行一定进程的优化。OpenCV莫得向量(vector)的数据结构,但当咱们要示意向量时,需要用矩阵数据示意。关联词,CvMat更抽象,它的元素数据类型并不仅限于基础数据类型,而且不错是苟且的预界说数据类型,比如RGB或者别的多通说念数据。、
在OpenCV类型关系上,咱们不错说IplImage类型接管自CvMat类型,虽然还包括其他的变量将之领悟成图像数据。IplImage类型较之CvMat多了许多参数,比如depth和nChannels。IplImage对图像的另一种优化是变量origin原点,为了弥补这少量,OpenCV允许用户界说我方的原点设置。
1.3 VivadoHLS中图像数据类型hls::Mat<>
VivadoHLS视频处理函数库使用hls::Mat<>数据类型,这种类型用于模子化视频像素流处理,骨子等同于hls::steam<>流的类型,而不是OpenCV中在外部memory中存储的matrix矩阵类型。因此,在用vivadoHLS达成OpenCV的遐想中,需要将输入和输出HLS可玄虚的视频遐想接口,修改为Video stream接口,也即是选择HLS提供的video接口可玄虚函数,达成AXI4 video stream到VivadoHLS中hls::Mat<>类型的调养。
2 使用VivadoHLS达成OpenCV到RTL代码调养的历程
2.1 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器件上达成视频处理的系统结构。
图2.1 Zynq视频处理系统结构
2.2 在FPGA/Zynq开垦中使用VivadoHLS达成OpenCV的遐想历程
遐想开垦历程主要有如图2.2三个身手。
1. 在盘算机上开垦OpenCV应用,由于是开源的遐想,选择C++的编译器对其进行编译,仿真和debug,临了产生可实施文献。这些遐想无需修改即可在 ARM内核上驱动OpenCV应用。
2. 使用I/O函数抽取FPGA达成的部分,何况使用可玄虚的VivadoHLS Video库函数代码代替OpenCV函数的调用。
3. 驱动HLS生成RTL代码,在VivadoHLS工程中启动co-sim,HLS器具自动重用OpenCV的测试引发考据产生的RTL代码。在Xilinx的ISE或者Vivado开垦环境中作念RTL的集成和SoC/FPGA达成。
图2.2 在FPGA/Zynq遐想中使用OpenCV的开垦历程
2.2.1 VivadoHLS视频库函数
HLS视频库是包含在hls定名空间内的C++代码。#include “hls_video.h”
HLS视频库与OpenCV等具有不异的接口和等效的行径,举例:
OpenCV库:cvScale(src, dst, scale, shift);
HLS视频库:hls::Scale<...>(src, dst, scale, shift);
HLS视频库的一些构造函数具有肖似的或替代性的模板参数,举例:
OpenCV库:cv::Mat mat(rows, cols, CV_8UC3);
HLS视频库:hls::Mat mat(rows, cols);
ROWS和COLS指定处理的最大图像尺寸香港三级。
表1 VivadoHLS视频处理函数库
2.2.2 VivadHLS达成OpenCV遐想的局限性
最初,必须用HLS视频库函数代替OpenCV调用。
其次,不撑捏OpenCV通过指针侦查帧缓存,不错在HLS中使用VDMA和 AXI Stream adpater函数代替。
再者,不撑捏OpenCV的立地侦查。HLS关于读取卓绝一次的数据必须进行复制,更多的例子不错参见见hls::Duplicate()函数。
临了,不撑捏OpenCVS的In-place更新,比如 cvRectangle (img, point1, point2)。
下表2列举了OpenCV中立地侦查一帧图像处理对应HLS视频库的达成方法。
表2 OpenCV和HLS中对一帧图像像素调核对应方法
OpenCV
HLS视频库
读操作
pix = cv_mat.at(i,j)
pix = cvGet2D(cv_img,i,j)
hls_img>> pix
写操作
cv_mat.at(i,j) = pix
cvSet2D(cv_img,i,j,pix)
hls_img<< pix
2.3 用HLS达成OpenCV应用的实例(快速角点滤波器image_filter)
咱们通过快速角点的例子,领悟简单用VivadoHLS达成OpenCV的历程。最初,开垦基于OpenCV的快速角点算法遐想,并使用基于OpenCV的测试引发仿真考据这个算法。接着,栽植基于视频数据流链的OpenCV处理算法,改写前边OpenCV的简单遐想,这么的改写是为了与HLS视频库处理机制换取,节略背面身手的函数替换。临了,将改写的OpenCV遐想中的函数,替换为HLS提供的相应功能的视频函数,并使用VivadoHLS玄虚,在Xilinx开垦环境下在FPGA可编程逻辑或当作Zynq SOC硬件加速器达成。虽然,这些可玄虚代码也可在处理器或ARM上驱动。
2.3.1 遐想基于OpenCV的视频滤波器遐想和测试引发
在这个例子中,最初遐想开垦齐全调用OpenCV库函数的快速角点滤波器遐想opencv_image_filter.cpp和这个滤波器的测试引发(不在本例中展示),测试引发用于仿真考据opencv_image_filter算法功能。OpenCV算法达成的遐想代码如下:
void opencv_image_filter(IplImage* src, IplImage* dst)
{
IplImage* gray = cvCreateImage( cvGetSize(src), 8, 1 );
std::vectorkeypoints;
cv::Mat gray_mat(gray,0);
cvCvtColor(src, gray, CV_BGR2GRAY );
cv::FAST( gray_mat, keypoints, 20, true);
cvCopy( src,dst);
for (inti=0;i
{
巨乳学院cvRectangle(dst, cvPoint(keypoints[i].pt.x-1,keypoints[i].pt.y-1),
cvPoint(keypoints[i].pt.x+1,keypoints[i].pt.y+1), cvScalar(255,0,0),CV_FILLED);
}
cvReleaseImage( &gray );
}
例子2.3.1 简单的OpenCV视频处理代码opencv_image_filter.cpp
上头的例子是径直调用OpenCV在处理器上软件应用达成的例子,不错看到在算法遐想中径直调用opencV库函数,测试引发读入图像,经过滤波器处理输出的图像保存分析。不错看到,算法的处理基于IPIimage类型,输入和输出图像皆使用此类型。
2.3.2 使用IO函数和Vivado HLS视频库替换OpenCV函数库
需要特地领悟的是,Xilinx公司简单使用的视频处理模块是基于AXI4 streaming条约进行不同模式见像素数据的交互,也即是咱们所说的AXI4 video接口条约神气。为了和Xilinx视频库接口条约长入,VivadoHLS提供了视频接口函数库,用于从OpenCV要领中抽取需要进行RTL玄虚调养的顶层函数,并把这些可玄虚的代码和OpenCV不可玄虚调养的代码进行窒碍。然后,对需要玄虚调养为RTL代码的OpenCV函数,用Xilinx VivadoHLS提供相应功能的可玄虚video函数进行替换。临了在C/C++编译环境下仿真考据OpenCV代码和替换video函数后功能的一致性,并在VivadoHLS开垦环境中作念代码玄虚和产生RTL代码的co-sim羼杂仿真考据。
VivadoHLS可玄虚的视频接口函数:
Hls::AXIvideo2Mat 调养AXI4 video stream到hls::Mat示意神气
Hls::Mat2AXIvideo 调养hls::Mat数据神气到AXI4 video stream
最初,咱们对2.3.1中OpenCV的遐想进行改写,改写的代码一经齐全基于OpenCV的函数,谋划是为了对视频的处理机制基于视频流的形状,与VivadoHLS视频库提供函数的处理机制一致。
其次,使用Vivado HLS视频库替代要领OpenCV函数,并使用可玄虚的视频接口函数,选择video stream的形状交互视频数据。用于FPGA的硬件可玄虚模块由VivadoHLS视频库函数与接口构成,咱们用hls定名空间中的不异函数代替OpenCV函数,加多接口函数构建AXI4 stream类型的接口。
void image_filter(AXI_STREAM& input, AXI_STREAM& output, int rows, int cols)
{
hls::Mat _src(rows,cols);
hls::Mat _dst(rows,cols);
hls::AXIvideo2Mat(input, _src);
hls::Mat src0(rows,cols);
hls::Mat src1(rows,cols);
hls::Mat mask(rows,cols);
hls::Matdmask(rows,cols);
hls::Scalar<3,unsigned char> color(255,0,0);
hls::Duplicate(_src,src0,src1);
hls::Mat gray(rows,cols);
hls::CvtColor(src0,gray);
hls::FASTX(gray,mask,20,true);
hls::Dilate(mask,dmask);
hls::PaintMask(src1,dmask,_dst,color);
hls::Mat2AXIvideo(_dst, output);
}
例子2.3.2 选择VivadoHLS视频库替换后可玄虚的遐想opencv_image_filter.cpp
临了,在vivadoHLS开垦环境下玄虚例子2.3.2.2的遐想,产生RTL代码并重用OpenCV的测试引发考据RTL代码功能。
3 VHLS达成OpenCV遐想历程回首
OpenCV函数可达成盘算机视觉算法的快速原型遐想,并使用VivadoHLS器具调养为RTL代码,在FPGA可编程逻辑上或者Zynq SoC逻辑上当作硬件加速器,达成高永诀率高帧率的及时视频处理。盘算机视觉应用与生俱来的异构特色,使其需要软硬件不绝结的达成决策,选择Vivado HLS视频库能加速OpenCV函数向FPGA或Zynq SOC全可编程架构的映射。
参考文献:
[1]Vivado Design Suite User Guide: High-LevelSynthesis(UG902).
[2]Accelerating OpenCV applications with Zynq using VivadoHLS video libraries(XAPP1167)
[3]Bradski G,Kaebler “A.Learning OpenCV”.ISBN 978-7-302-20993-5
[4]Implementing Memory structure for video processing in the vivadoHLStool(XAPP793)
[5] Rafael C.Gonzalez香港三级,Richard E.Wood “Digital Image Processing, Third Edition”ISBN 978-7-121-11008-5