微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > Xilinx Zynq使用HLS实现OpenCV的开发流程

Xilinx Zynq使用HLS实现OpenCV的开发流程

时间:03-13 来源:电子产品世界 点击:

设计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)

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top