Xilinx Zynq使用HLS实现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)
可编程 处理器 VivadoHLS OpenCV 相关文章:
- Reed Solomon编解码器的可编程逻辑实现(06-21)
- 基于VxWorks的MB系列智能可编程控制器设计(01-16)
- 在应用可编程测控网络设计(03-15)
- 基于AT89C51单片机的微型可编程控制器(04-23)
- 基于可编程DSP内核为通信和多媒体SoC提供出色功控(01-10)
- 可编程逻辑技术在数字信号处理系统中的应用(03-09)