您的位置 首页 分销

Vivado规划流程剖析 Vivado HLS完成OpenCV的开发流程

Vivado设计流程分析 Vivado HLS实现OpenCV的开发流程-作者:Harvest Guo来源:Xilinx DSP Specilist 本文通过对OpenCV中图像类型和函数处理方法的介绍,通过设计实例描述在vivadoHLS中调用OpenCV库函数实现图像处理的几个基本步骤,完成从OpenCV设计到RTL转换综合的开发流程。 开源计算机视觉 (OpenCV) 被广泛用于开发计算机视觉应用,它包含2500多个优化的视频函数的函数库并且专门针对台式机处理器和GPU进行优化。OpenCV的用户成千上万,OpenCV的设计无需修改即可在 Zynq器件的ARM处理器上运行。但是利用OpenCV实现的高清

作者:Harvest Guo来历:Xilinx DSP Specilist

  本文经过对OpenCV中图画类型和函数处理办法的介绍,经过规划实例描绘在vivadoHLS中调用OpenCV库函数完结图画处理的几个根本过程,完结从OpenCV规划到RTL转化归纳的开发流程。

  开源核算机视觉 (OpenC++V) 被广泛用于开发核算机视觉运用,它包括2500多个优化的视频函数的函数库并且专门针对台式机处理器和GPU进行优化。OpenCV的用户不计其数,OpenCV的规划无需修正即可在 Zynq器材的ARM处理器上运转。可是运用OpenCV完结的高清处理常常受外部存储器的约束,尤其是存储带宽会成为功用瓶颈,存储拜访也会约束功耗功率。运用VivadoHLS高档言语归纳东西,能够轻松完结OpenCV C++视频处理规划到RTL代码的转化,输出硬件加速器或许直接在FPGA上完结实时视频处理功用。一起,Zynq All-programmable SOC是完结嵌入式核算机视觉运用的极好办法,很好处理了在单一处理器上完结视频处理功用低功耗高的约束,Zynq高功用可编程逻辑和嵌入式ARM内核,是一款功耗优化的集成式处理计划。

  1 OpenCV中图画IplImage, CvMat, Mat 类型的联系和VivadoHLS中图画hls::Mat类型介绍

  OpenCv中常见的与图画操作有关的数据容器有Mat,cvMat和IplImage,这三种类型都能够代表和显现图画,可是,Mat类型侧重于核算,数学性较高,openCV对Mat类型的核算也进行了优化。而CvMat和IplImage类型更侧重于“图画”,opencv对其间的图画操作(缩放、单通道提取、图画阈值操作等)进行了优化。在opencv2.0之前,opencv是彻底用C完结的,可是,IplImage类型与CvMat类型的联系类似于面向对象中的承继联系。实际上,CvMat之上还有一个更笼统的基类—-CvArr,这在源代码中会常见。

  1.1 OpenCV中Mat类型:矩阵类型(Matrix)。

  在openCV中,Mat是一个多维的密布数据数组。能够用来处理向量和矩阵、图画、直方图等等常见的多维数据。

  Mat有3个重要的办法:

  1、Mat mat = imread(const String* filename); 读取图画

  2、imshow(const string frameName, InputArray mat); 显现图画

  3、imwrite (const string& filename, InputArray img); 贮存图画

  Mat类型较CvMat与IplImage类型来说,有更强的矩阵运算才能,支撑常见的矩阵运算。在核算密布型的运用傍边,将CvMat与IplImage类型转化为Mat类型将大大削减核算时刻花费。

  1.2 OpenCV中CvMat类型与IplImage类型:“图画”类型

  在openCV中,Mat类型与CvMat和IplImage类型都能够代表和显现图画,可是,Mat类型侧重于核算,数学性较高,openCV对Mat类型的核算也进行了优化。而CvMat和IplImage类型更侧重于“图画”,openCV对其间的图画操作(缩放、单通道提取、图画阈值操作等)进行了优化。

  补偿:IplImage由CvMat派生,而CvMat由CvArr派生即CvArr -》 CvMat -》 IplImage

  CvArr用作函数的参数,不管传入的是CvMat或IplImage,内部都是按CvMat处理。

  在openCV中,没有向量(vector)的数据结构。任何时候,但咱们要表明向量时,用矩阵数据表明即可。

  可是,CvMat类型与咱们在线性代数课程上学的向量概念比较,更笼统,比方CvMat的元素数据类型并不仅限于根底数据类型,比方,下面创立一个二维数据矩阵:

  CvMat* cvCreatMat(int rows ,int cols , int type);

  这儿的type能够是恣意的预界说数据类型,比方RGB或许其他多通道数据。这样咱们便能够在一个CvMat矩阵上表明五光十色的图画了。

  1.3 OpenCV中IplImage类型

  在OpenCV类型联系上,咱们能够说IplImage类型承继自CvMat类型,当然还包括其他的变量将之解析成图画数据。

  IplImage类型较之CvMat多了许多参数,比方depth和nChannels。在一般的矩阵类型傍边,一般深度和通道数被一起表明,如用32位表明RGB+Alpha.可是,在图画处理中,咱们往往将深度与通道数分隔处理,这样做是OpenCV对图画表明的一种优化计划。

  IplImage的对图画的另一种优化是变量origin—-原点。在核算机视觉处理上,一个重要的不便是对原点的界说不清楚,图画来历,编码格局,乃至操作系统都会对原地的选取发生影响。为了补偿这一点,openCV答运用户界说自己的原点设置。取值0表明原点坐落图片左上角,1表明左下角。

  1.4 VivadoHLS中图画数据类型hls::Mat《》

  VivadoHLS视频处理函数库运用hls::Mat《》数据类型,这种类型用于模型化视频像素流处理,本质等同于hls::steam《》流的类型,而不是OpenCV中在外部memory中存储的matrix矩阵类型。因而,在HLS完结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很难满意高功用和低功耗的需求。

  根据视频流的架构能供给高功用和低功耗,链条化的图画处理函数能削减外部存储器拜访,针对视频优化的行缓存和窗口缓存比处理器高速缓存更简略,更易于用FPGA部件,运用VivadoHLS中的数据流优化来完结。

  VivadoHLS对OpenCV的支撑,不是指能够将OpenCV的函数库直接综组成RTL代码,而是需求将代码转化为可归纳的代码,这些可归纳的视频库称为HLS视频库,由VivadoHLS供给。

  OpenCV函数不能直接经过HLS进行归纳,由于OpenCV函数一般都包括动态的内存分配、浮点以及假定图画在外部存储器中寄存或许修正。

  VivadoHLS视频库用于替换许多根本的 OpenCV函数,它与OpenCV具有类似的接口和算法,首要针对在FPGA架构中完结的图画处理函数,包括了专门面向FPGA的优化,比方定点运算而非浮点运算(不用准确到比特位),片上的行缓存(line buffer)和窗口缓存(window buffer)。

  2.2 VivadoHLS完结OpenCV规划流程介绍

  运用VivadoHLS完结OpenCV的开发,首要的三个过程如下:

  在核算机上开发OpenCV运用,由所以开源的规划,选用C++的编译器对其进行编译,仿真和debug,最终发生可执行文件。这些规划无需修正即可在 ARM内核上运转OpenCV运用。

  运转HLS生成RTL代码,在vivadoHLS工程中发动co-sim,重用openCV的测验鼓励验证发生的RTL代码。在ISE或许Vivado开发环境中做RTL的集成和SOC/FPGA完结。

  2.2.1 VivadoHLS视频库函数

  HLS视频库是包括在hls命名空间内的C++代码。#include “hls_video.h”

  与OpenCV等具有类似的接口和等效的行为,例如:

  OpenCV库:cvScale(src, dst, scale, shift);

  HLS视频库:hls:cale《。。。》(src, dst, scale, shift);

  一些结构函数具有类似的或替代性的模板参数,例如:

  OpenCV库:cv::Mat mat(rows, cols, CV_8UC3);

  HLS视频库:hls::Mat mat(rows, cols);

  ROWS和COLS指定处理的最大图画尺度

  表2.2.1 VivadoHLS视频处理函数库

  2.2.2 VivadHLS完结OpenCV规划的局限性

  首要,有必要用HLS视频库函数替代OpenCV调用。

  其次,不支撑OpenCV经过指针拜访帧缓存,能够在HLS中运用VDMA和 AXI Stream adpater函数替代。

  再者,不支撑OpenCV的随机拜访。HLS关于读取超越一次的数据有必要进行仿制,更多的比方能够拜见见hls:uplicate()函数。

  最终,不支撑OpenCVS的In-place更新,比方 cvRectangle (img, point1, point2)。

  下面表格2.2.2列举了OpenCV中随机拜访一帧图画处理对应HLS视频库的完结办法。

  OpenCVHLS视频库

  读操作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.2.2 OpenCV和HLS中对一帧图画像素拜访对应办法

  2.3 用HLS完结OpenCV运用的实例(快速角点滤波器image_filter)

  咱们经过快速角点的比方,阐明一般用VivadoHLS完结OpenCV的流程。首要,开发根据OpenCV的快速角点算法规划,并运用根据OpenCV的测验鼓励仿真验证这个算法。接着,树立根据视频数据流链的OpenCV处理算法,改写前面直觉的OpenCV的一般规划,这样的改写是为了与HLS视频库处理机制相同,便利后边过程的函数替换。最终,将改写的OpenCV规划中的函数,替换为HLS供给的相应功用的视频函数,并用VivadoHLS归纳,最终在Xilinx开发环境下完结。当然,这些可归纳代码也可在处理器或ARM上运转。

  2.3.1 规划根据OpenCV的视频滤波器规划和测验鼓励

  在这个比方中,首要规划开发彻底调用OpenCV库函数的快速角点滤波器规划opencv_image_filter.cpp和这个滤波器的测验鼓励opencv_image_filter_tb.cpp,测验鼓励用于仿真验证opencv_image_filter算法功用。算法和测验鼓励规划代码如下:

  void opencv_image_filter(IplImage* src, IplImage* dst)

  {

  IplImage* gray = cvCreateImage( cvGetSize(src), 8, 1 );

  std::vector keypoints;

  cv::Mat gray_mat(gray,0);

  cvCvtColor( src, gray, CV_BGR2GRAY );

  cv::FAST( gray_mat, keypoints, 20, true);

  cvCopy( src,dst);

  for (int i=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.1 一般的OpenCV视频处理代码opencv_image_filter.cpp

  int main (int argc, char** argv) {

  IplImage* src=cvLoadImage(INPUT_IMAGE);

  IplImage* dst = cvCreateImage(cvGetSize(src), src-》depth, src-》nChannels);

  opencv_image_filter(src, dst);

  cvSaveImage(OUTPUT_IMAGE_GOLDEN, dst);

  cvReleaseImage(&src);

  cvReleaseImage(&dst);

  return 0;

  }

  比方2.3.1.2 OpenCV视频处理测验鼓励代码opencv_image_filter_tb.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视频库供给函数的处理机制共同。下面是OpenCV规划的另一种写法:

  void opencv_image_filter(IplImage* src, IplImage* dst)

  {

  IplImage* gray = cvCreateImage( cvGetSize(src), 8, 1 );

  IplImage* mask = cvCreateImage( cvGetSize(src), 8, 1 );

  IplImage* dmask = cvCreateImage( cvGetSize(src), 8, 1 );

  std::vector keypoints;

  cv::Mat gray_mat(gray,0);

  cvCvtColor(src, gray, CV_BGR2GRAY );

  cv::FAST(gray_mat, keypoints, 20, true);

  GenMask(mask, keypoints);

  cvDilate(mask,dmask);

  cvCopy(src,dst);

  PrintMask(dst,dmask,cvScalar(255,0,0));

  cvReleaseImage( &mask );

  cvReleaseImage( &dmask );

  cvReleaseImage( &gray );

  }

  比方2.3.2.1另一种OpenCV规划运用opencv_image_filter.cpp

  其次,运用Vivado HLS视频库替代规范OpenCV函数,并运用可归纳的视频接口函数,选用video stream的方法交互视频数据。用于FPGA的硬件可归纳模块由VivadoHLS视频库函数与接口组成,咱们用hls命名空间中的类似函数替代OpenCV函数,添加接口函数构建AXI4 stream类型的接口。

  void image_filter(AXI_STREAM& input, AXI_STREAM& output, int rows, int cols)

  {

  //Create AXI streaming interfaces for the core

  #pragma HLS RESOURCE variable=input core=AXIS metadata=“-bus_bundle INPUT_STREAM”

  #pragma HLS RESOURCE variable=output core=AXIS metadata=“-bus_bundle OUTPUT_STREAM”

  #pragma HLS RESOURCE core=AXI_SLAVE variable=rows metadata=“-bus_bundle CONTROL_BUS”

  #pragma HLS RESOURCE core=AXI_SLAVE variable=cols metadata=“-bus_bundle CONTROL_BUS”

  #pragma HLS RESOURCE core=AXI_SLAVE variable=return metadata=“-bus_bundle CONTROL_BUS”

  #pragma HLS interface ap_stable port=rows

  #pragma HLS interface ap_stable port=cols

  hls::Mat _src(rows,cols);

  hls::Mat _dst(rows,cols);

  #pragma HLS dataflow

  hls::AXIvideo2Mat(input, _src);

  hls::Mat src0(rows,cols);

  hls::Mat src1(rows,cols);

  #pragma HLS stream depth=20000 variable=src1.data_stream

  hls::Mat mask(rows,cols);

  hls::Mat dmask(rows,cols);

  hls:calar《3,unsigned char》 color(255,0,0);

  hls:uplicate(_src,src0,src1);

  hls::Mat gray(rows,cols);

  hls::CvtColor(src0,gray);

  hls::FASTX(gray,mask,20,true);

  hls:ilate(mask,dmask);

  hls:aintMask(src1,dmask,_dst,color);

  hls::Mat2AXIvideo(_dst, output);

  }

  比方2.3.2.2 选用VivadoHLS视频库替换后可归纳的规划opencv_image_filter.cpp

  最终,在vivadoHLS开发环境下归纳比方2.3.2.2的规划,发生RTL代码并重用OpenCV的测验鼓励验证RTL代码功用。

  3 VHLS完结OpenCV规划流程总结

  经过上面章节介绍以及在vivadoHLS东西中完结opencV规划的比方能够看出,OpenCV函数可完结核算机视觉算法的快速原型规划,并运用VivadoHLS东西转化为RTL代码在FPGA或许Zynq SOC上完结高分辨率高帧率的实时视频处理。核算机视觉运用与生俱来的异构特性,使其需求软硬件相结合的完结计划。Vivado HLS视频库能加速OpenCV函数向FPGA可编程架构的映射。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/fenxiao/340017.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部