当前位置:首页 >> 信息与通信 >>

Vivado HLS视频库加速Zynq-7000 All Programmable SoC OpenCV应用


如何使用Vivado HLS视频库加速Zynq-7000 All Programmable g SoC OpenCV p 应用
2013年9月11日
? Copyright 2013 Xilinx
.

OpenCV简介
开源计算机视觉 机 (OpenCV) ( p ) 被广泛用于开发计算机视觉应用 机

包含2500多个优化的视频函数的函数库 – 专门针对台式机处理器和GPU进行优化 – 用户成千上万 – 无需修改即可在 Zynq器件的ARM处理器上运行

但是
– 利用OpenCV实现的高清处理经常受外部存储器的限制 – 存储带宽会成为性能瓶颈 – 存储访问会限制功耗效率

Zynq All-programmable SOC是实现嵌入式计算机视觉应用的极 好方法
– 性能高、功耗低

第2页

? Copyright 2013 Xilinx
.

实时计算机视觉应用
计算机视觉应用 实时分析功能
车道或行人检测

高级驾驶员安全辅助

安防监视

敌我识别

用于工厂自动化的 机器视觉

高速物体检测

非侵入式医疗成像技术

肿瘤检测

第 3页

? Copyright 2013 Xilinx
.

实时视频分析处理
基于像素的 图像处理与特征提取 基于帧的 特征处理与 决策

Pixel based 4Kx2K Image processing and Feature extraction F1 F2 F3 …..

1080p 720p 480 480p 每像素数百次运算 800万次处理x每帧100次运算 = 数百亿次运算
第4页
.

每特性数10000次运算 每秒处理数1000个特征 = 数百万次运算

? Copyright 2013 Xilinx

实时视频分析的异构实现
基于像素的图像处理与特征 提取

基于帧的 特征处理与判定

Pixel based 4Kx2K Image processing and Feature extraction 硬件域 (FPGA) 1080p 720p 480 480p 每像素数百次运算 800万次处理x每帧100次运算 = 数百亿次运算
第5页
.

F1 F2 软件域 F3 (ARM) …..

每特性数10000次运算 每秒处理数1000个特征 = 数百万次运算

? Copyright 2013 Xilinx

赛灵思实时图像分析的实现:Zynq All Programmable SoC
基于像素的图像处理与特征 提取 Frame based Feature processing and 基于帧的特征处理与判定 decision making

Pixel based 4Kx2K Image processing and Feature extraction F1 F2 F3 …..

1080p 720p 480 480p 每像素数百次运算 800万次处理x每帧100次运算 = 数百亿次运算
第6页
.

每特性数10000次运算 每秒处理数1000个特征 = 数百万次运算

? Copyright 2013 Xilinx

Vivado:提高OpenCV应用的效率

高清视频算法(每秒约1帧 )的C语言仿真
– 高清视频(每小时1 帧)的 RTL仿真

实时FPGA实现方案高达 60fps

第7页

? Copyright 2013 Xilinx
.

Zynq视频参考设计架构
DDR3

DDR3外部存储器

处理系统

DDR存储控制器

SD卡

硬化的外设

双核 Cortex-A9

S_AXI_HP 64 位 S_AXI_GP 32b 位 AXI4 Stream S IP核

AXI互联
AXI VDMA

HDMI

视频输入

HLS生成的流水线

Xylon显示 控制器

HDMI

使用64位高性能端口实现对外部存储器的视频访问 使用32位通用端口实现控制寄存器访问 使用AXI4-Stream实现的视频流
第8页

? Copyright 2013 Xilinx
.

以IP为中心的设计流程
更快速的IP生成与集成
基于C语言的IP创建
C、C++ 或 SystemC

用户首选的系统集成环境

C 函数库
? 浮点math.h ? 定点 ? 视频

DSP系统生成器 (System Generator)

VHDL 或Verilog V il 以 及软件驱动

Vivado IP集成器

IP子系统 赛灵思IP 第三方IP 用户IP

Vivado RTL集成

第9页

? Copyright 2013 Xilinx
.

Page 10

? Copyright 2013 Xilinx
.

在FPGA设计中使用OpenCV

纯 OpenCV应用

集成的OpenCV O CV 应用

OpenCV参考
图像文件读取 (OImage penCV)

O CV应 加速的OpenCV 用

图像文件读取 (OpenCV)

实时视频输入 OpenCV2AXIvideo

实时视频输入

AXIvideo2Mat 可综合的 的模块

AXIvideo2Mat 可综合的模块

O CV函数链 OpenCV

O CV函数链 OpenCV

HLS视频库函数链

HLS视频库函数链

Mat2AXIvideo 图像文件写入 (OpenCV)

Mat2AXIvideo

实时视频输出

AXIvideo2OpenCV 图像文件写入 (OpenCV)

实时视频输出

第11页

? Copyright 2013 Xilinx
.

纯OpenCV应用

图像文件读取 (OpenCV)

DDR3 外部存储器

DDR3

处理系统 SD 卡 硬化的外设

DDR存储控制器

OpenCV函数链

双核 Cortex-A9 Cortex A9

图像文件写入 (OpenCV) AXI VDMA

AXI互联

HDMI

视频输入

HLS生成的流水线

y 显示 Xylon 控制器

HDMI

第12页

? Copyright 2013 Xilinx
.

纯OpenCV应用

图像文件读取 (OpenCV)

DDR3 外部存储器

1 DDR3 2

3

4

5

处理系统 SD 卡 硬化的外设

DDR存储控制器

OpenCV函数链

双核 Cortex-A9 Cortex A9

图像文件写入 (OpenCV) AXI VDMA

AXI互联

HDMI

视频输入

HLS生成的流水线

y 显示 Xylon 控制器

HDMI

第13页

? Copyright 2013 Xilinx
.

纯OpenCV应用

图像文件读取 (OpenCV)

DDR3 外部存储器

DDR3

处理系统 SD 卡 硬化的外设

DDR存储控制器

OpenCV函数链

双核 Cortex-A9 Cortex A9

图像文件写入 (OpenCV) AXI VDMA

AXI互联

HDMI

视频输入

HLS生成的流水线

y 显示 Xylon 控制器

HDMI

第14页

? Copyright 2013 Xilinx
.

集成的OpenCV应用

DDR3 外部存储器
实时视频输入

1 DDR3 2

3

4

5

处理系统 SD 卡
OpenCV p 函数链

DDR存储控制器

硬化的外设

双核 Cortex-A9 Cortex A9

AXI互联

实时视频输出 AXI VDMA

HDMI

视频输入

HLS生成的流水线

y 显示 Xylon 控制器

HDMI

第15页

? Copyright 2013 Xilinx
.

OpenCV参考/软件执行

图像文件读取 (OImage penCV) OpenCV2AXIvideo

DDR3 外部存储器

1 DDR3 2

3

4

5

处理系统 SD 卡 硬化的外设

DDR存储控制器

AXIvideo2Mat

HLS视频库函数链

双核 Cortex-A9 Cortex A9

Mat2AXIvideo
AXI互联

AXIvideo2OpenCV AXI VDMA 图像文件写入 (OpenCV)

HDMI

视频输入

HLS生成的流水线

Xylon y 显示 控制器

HDMI

第16页

? Copyright 2013 Xilinx
.

OpenCV参考/系统测试

图像文件读取 (OImage penCV) OpenCV2AXIvideo

DDR3 外部存储器

1 DDR32
DDR存储控制器

处理系统 SD 卡 硬化的外设

AXIvideo2Mat

HLS视频库函数链

双核 Cortex-A9 Cortex A9

Mat2AXIvideo
AXI互联

AXIvideo2OpenCV AXI VDMA 图像文件写入 (OpenCV)

HDMI

视频输入

HLS生成的流水线

Xylon y 显示 控制器

HDMI

第17页

? Copyright 2013 Xilinx
.

加速的OpenCV应用

DDR3 外部存储器
实时视频输入

1 DDR32
DDR存储控制器

处理系统 SD 卡 硬化的外设

AXIvideo2Mat

HLS视频库函数链

双核 Cortex-A9 Cortex A9

Mat2AXIvideo

AXI互联

实时视频输出

AXI VDMA

HDMI

视频输入

HLS生成的流水线

y 显示 Xylon 控制器

HDMI

第18页

? Copyright 2013 Xilinx
.

OpenCV设计流程
OpenCV模块A

1) 在台式机上开发OpenCV应用 2) 无需修改即可在 ARM内核上运行OpenCV应 用

OpenCV模块B

3) 使用I/O函数抽象FPGA部分 4) 用可综合代码代替OpenCV函数调用

O CV模块C OpenCV

5) 运行HLS以生成 FPGA加速器 6) 用FPGA加速器调用代替可综合代码调用

OpenCV模块D

第19页

? Copyright 2013 Xilinx
.

OpenCV应用的软硬划分
OpenCV 模块 A
opencv2AXIvideo AXIvideo2HLS

OpenCV 模块 B
同步

HLS 模块 B

O CV 模块 C OpenCV

HLS 模块 C

HLS2AXIvideo

综合

OpenCV 模块 D

AXIvideo2opencv

Page 20

? Copyright 2013 Xilinx
.

OpenCV设计中的权衡
OpenCV图像处理是基于存储器帧缓存而构建的
– 访问局部性较差 -> 小容量高速缓存性能不足 – 架构比较复杂(出于性能考虑) -> 功耗更高 – 似乎足以满足很多应用的要求
? 分辨率或帧速率低 ? 在更大的图像中对需要的特征或区域进行处理

基于视频流的架构能提供高性能和低功耗
– 链条化的图像处理函数能减少外部存储器访问 针对视频优化的行缓存和窗 缓存比处理器高速缓存更简单 – 针对视频优化的行缓存和窗口缓存比处理器高速缓存更简单 – 可使用HLS中的数据流优化来实现 – 需要将代码转换为可综合的代码

? Copyright 2013 Xilinx
.

HLS视频库

O OpenCV C 函数不能直接通过HLS S进行综合
– 动态内存分配 – 浮点 – 假设图像在外部存储器中修改

HLS视频库用于替换很多基本的 OpenCV函数
– 与OpenCV具有相似的接口和算法 – 主要针对在FPGA架构中实现的图像处理函数 – 包含专门面向FPGA的优化
? 定点运算而非浮点运算 ? 片上的行缓存和窗口缓存

– 不必精确到比特位

第22页

? Copyright 2013 Xilinx
.

赛灵思HLS视频库2013.2
视频数据建模 Li b ff Class Linebuffer Cl Wi d Window Class Cl AXI4-Stream IO 函数 AXIvideo2Mat Mat2AXIvideo

OpenCV 接口函数 cvMat2AXIvideo AXIvideo2cvMat I lI IplImage2AXIvideo 2AXI id AXI id 2I lI AXIvideo2IplImage CvMat2AXIvideo AXIvideo2CvMat 视频函数 AbsDiff AddS AddWeighted And Avg AvgSdv Cmp CmpS CornerHarris CvtColor Dilate

cvMat2hlsMat I lI IplImage2hlsMat 2hl M t CvMat2hlsMat MaxS Mean Merge Min MinMaxLoc MinS Mul Not PaintMask Range Reduce

hlsMat2cvMat hl M t2I lI hlsMat2IplImage hlsMat2CvMat Remap Resize Scale Set Sobel Split SubRS SubS Sum Threshold Zero

Duplicate EqualizeHist Erode FASTX Filter2D GaussianBlur Harris HoughLines2 Integral InitUndistortRectifyMap Max

如需了解函数的详情,敬请阅读HLS用户指南 UG 902
第23页

? Copyright 2013 Xilinx
.

视频库函数

包含在hls命名空间内的C++代码。#include “hls hls_video.h video h” 与OpenCV等具有相似的接口和等效的行为,例如
– OpenCV p 库: – HLS视频库: – OpenCV库: – HLS视频库:
cvScale(src, dst, scale, shift); hls::Scale<...>(src, dst, scale, shift);

一些构造函数具有类似的或替代性的模板参数,例如
cv::Mat mat(rows, cols, CV_8UC3); hls::Mat<ROWS, COLS, HLS_8UC3> mat(rows, cols);

ROWS和COLS指定处理的最大图像尺寸

第24页

? Copyright 2013 Xilinx
.

视频库的核心结构

OpenCV
cv::Point_<T>, CvPoint cv::Size <T>, CvSize cv::Size_<T>, cv::Rect_<T>, CvRect cv::Scalar_<T>, CvScalar cv::Mat, IplImage, CvMat cv::Mat mat(rows, cols, CV_8UC3); IplImage* img = cvCreateImage(cvSize(cols,rows), IPL_DEPTH_8U, 3);

HLS 视频库
hls::Point_<T>, hls::Point hls::Size <T>, hls::Size hls::Size_<T>, hls::Rect_<T>, hls::Rect hls::Scalar<N, T> hls::Mat<ROWS, COLS, T> hls::Mat<ROWS, COLS, HLS_8UC3> mat (rows, cols); hls::Mat<ROWS, COLS, HLS_8UC3> img, (rows, cols); hls::Mat<ROWS, COLS, HLS_8UC3> img; hls::Window<ROWS, COLS, T> hls::LineBuffer<ROWS, COLS, T>

Page 25

? Copyright 2013 Xilinx
.

局限性
必须用视频库函数代替OpenCV调用 不支持通过指针访问帧缓存
– 使用VDMA和 AXI Stream adpater函数

不支持随机访问
– 读取超过一次的数据必须进行复制 – 请见hls::Duplicate() p ()

不支持In-place更新
– 例如 cvRectangle (img, point1, point2) g ( g, p , p ) OpenCV
读操作 pix = cv_mat.at<T>(i,j) pix = cvGet2D(cv_img,i,j) cv_mat.at<T>(i,j) = pix cvSet2D(cv_img,i,j,pix)
? Copyright 2013 Xilinx
.

HLS视频库
hls_img >> pix

写操作
第26页

hls_img << pix

OpenCV 代码
输入 个图像,输出 个图像 输入一个图像,输出一个图像
– 按函数链顺序处理
… IplImage* src=cvLoadImage("test_1080p.bmp"); IplImage* dst=cvCreateImage(cvGetSize(src), src->depth, src->nChannels); 图像读取 (OpenCV)

cvSobel(src, dst, 1, 0); cvSubS(dst, cvScalar(100,100,100), src); cvScale(src, dst, 2, 0); cvErode(dst, src); cvDilate(src, dst);

OpenCV 函数链

cvSaveImage( result_1080p.bmp cvSaveImage("result 1080p.bmp", , dst); cvReleaseImage(&src); cvReleaseImage(&dst); …

图像写入 (OpenCV)

test_opencv.cpp t t
Page 27

? Copyright 2013 Xilinx
.

集成的OpenCV应用
系统提供指向帧缓存的指针 可综合代码也可在ARM上运行
img process(ZNQ S32 *rgb data in ZNQ_S32 ZNQ S32 *rgb data out int void img_process(ZNQ_S32 *rgb_data_in, *rgb_data_out, height, int width, int stride, int flag_OpenCV) { // constructing OpenCV interface IplImage* src_dma = cvCreateImageHeader(cvSize(width, height), IPL_DEPTH_8U, 4); IplImage* dst_dma = cvCreateImageHeader(cvSize(width, height), IPL_DEPTH_8U, 4); src_dma->imageData = (char*)rgb_data_in; dst_dma->imageData = (char*)rgb_data_out; src_dma->widthStep p = 4 * stride; dst_dma->widthStep = 4 * stride; if (flag_OpenCV) { opencv_image_filter(src_dma, dst_dma); } else { sw_image_filter(src_dma, dst_dma); } cvReleaseImageHeader(&src_dma); cvReleaseImageHeader(&dst_dma); }
Page 28

实时视频输入

OpenCV 函数链

实时视频输出

img_filters.c
? Copyright 2013 Xilinx
.

使用Vivado HLS视频库加速
抽取顶层函数进行硬件加速
#include “hls_video.h” // header file of HLS video library #include “hls_opencv.h” // header file of OpenCV I/O // typedef video library core structures typedef hls::stream<ap_axiu<32,1,1,1> > typedef hls::Scalar<3, uchar> typedef hls::Mat<1080,1920,HLS_8UC3>

AXI_STREAM; RGB_PIXEL; RGB_IMAGE;

图像读取(OpenCV)

void image_filter(AXI_STREAM& src_axi, AXI_STREAM& dst_axi, int rows, int cols);

OpenCV2AXIvideo AXIvideo2Mat

top.h
#i l d “top.h” #include h … IplImage* src=cvLoadImage("test_1080p.bmp"); IplImage* dst=cvCreateImage(cvGetSize(src), src->depth, src->nChannels); AXI_STREAM src_axi, dst_axi; IplImage2AXIvideo(src, src_axi); image_filter(src_axi, dst_axi, src->height, src->width); AXIvideo2IplImage(dst_axi, dst); cvSaveImage("result_1080p.bmp", S I (" lt 1080 b " dst); d t) cvReleaseImage(&src); cvReleaseImage(&dst);
Page 29

HLS 视频库函数链

Mat2AXIvideo AXIvideo2OpenCV

图像写入 (OpenCV)

? Copyright 2013 Xilinx
.

test.cpp

使用Vivado HLS视频库加速
用于FPGA加速的硬件可综合模块
– 由视频库函数与接口组成 – 用hls命名空间中的相似函数代替OpenCV函数
图像读取(OpenCV)
void image_filter(AXI_STREAM& input, AXI_STREAM& output, int rows, int cols) { //Create AXI streaming interfaces for the core #pragma #pragma #pragma #pragma #pragma #pragma #pragma HLS HLS HLS HLS HLS HLS HLS RESOURCE variable=input core=AXIS metadata="-bus_bundle INPUT_STREAM" RESOURCE variable=output core=AXIS metadata="-bus_bundle OUTPUT_STREAM" RESOURCE variable=rows core=AXI_SLAVE core=AXI SLAVE metadata="-bus metadata= bus_bundle bundle CONTROL_BUS CONTROL BUS" RESOURCE variable=cols core=AXI_SLAVE metadata="-bus_bundle CONTROL_BUS" RESOURCE variable=return core=AXI_SLAVE metadata="-bus_bundle CONTROL_BUS" INTERFACE ap_stable port=rows INTERFACE ap_stable port=cols

OpenCV2AXIvideo AXIvideo2Mat

RGB_IMAGE img_0(rows, cols), img_1(rows, cols), img_2(rows, cols); RGB_IMAGE img_3(rows, cols), img_4(rows, cols), img_5(rows, cols); RGB_PIXEL pix(50, 50, 50); #pragma HLS dataflow hls::AXIvideo2Mat(input, img_0); hl hls::Sobel<1,0,3>(img_0, S b l<1 0 3>(i 0 i img_1); 1) hls::SubS(img_1, pix, img_2); hls::Scale(img_2, img_3, 2, 0); hls::Erode(img_3, img_4); hls::Dilate(img_4, img_5); hls::Mat2AXIvideo(img 5 output); hls::Mat2AXIvideo(img_5, }
Page 30

HLS 视频库函数链

Mat2AXIvideo AXIvideo2OpenCV

top.cpp
? Copyright 2013 Xilinx
.

图像写入 (OpenCV)

使用 Linux 用户空间的API
修改器件树,使其包含寄存器映射
FILTER@0x400D0000 { compatible = "xlnx,generic-hls"; reg = <0x400d0000 0xffff>; interrupts = <0x0 0x37 0x4>; interrupt-parent = <0x1>; };

实时视频输入

执行mmap()函数后从用户空间调用
Ximage_filter xsfilter; int t fd d_u uio o = 0; if ((fd_uio = open("/dev/uio0", O_RDWR)) < 0) { printf("UIO: Cannot open device node\n"); } xsfilter.Control_bus_BaseAddress = (u32)mmap(NULL, XSOBEL_FILTER_CONTROL_BUS_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd_uio, 0); xsfilter.IsReady = XIL_COMPONENT_IS_READY; // init the configuration for image filter XImage_filter_SetRows(&xsfilter, sobel_configuration.height); XImage_filter_SetCols(&xsfilter, sobel_configuration.width); XImage g _filter_EnableAutoRestart(&xsfilter); ( ); XImage_filter_Start(&xsfilter); AXIvideo2Mat

HLS 视频库函数链

Mat2AXIvideo

实时视频输出

Page 31

? Copyright 2013 Xilinx
.

HLS视频处理指令

将“input” “ 指定为以 “INPUT_STREAM” “ S 命名的AXI4 Stream S
#pragma HLS RESOURCE variable=input core=AXIS metadata="-bus_bundle INPUT_STREAM"

将控制接口分配到AXI4-Lite AXI4 Lite接口
#pragma HLS RESOURCE variable=return core=AXI_SLAVE metadata="-bus_bundle CONTROL_BUS"

指定“rows” rows 可通过AXI4-Lite接口进行访问
#pragma HLS RESOURCE variable=rows core=AXI_SLAVE metadata="-bus_bundle CONTROL_BUS"

声明在函数执行过程中 “rows”不会改变
#pragma HLS INTERFACE ap_stable port=rows

启用数据流优化
#pragma HLS dataflow

第32页

? Copyright 2013 Xilinx
.

更复杂的OpenCV实例:快速角点
代码不是“streaming”,必须重写
– 随机访问以及 “dst” in-place运算
void opencv_image_filter(IplImage* img, IplImage* dst ) { IplImage* gray = cvCreateImage(cvSize(img->width,img->height), 8, 1 ); cvCvtColor( img, gray, CV_BGR2GRAY ); std::vector<cv::KeyPoint> keypoints; cv::Mat gray_mat(gray,0); cv::FAST(gray_mat, keypoints, 20,true ); int rect=2; cvCopy(img,dst); for (int i=0; i<keypoints.size(); i++) { cvRectangle(dst, cvPoint(keypoints[i].pt.x,keypoints[i].pt.y), cvPoint(keypoints[i].pt.x+rect,keypoints[i].pt.y+rect), cvScalar(255,0,0),1); } cvReleaseImage( &gray ); } opencv_top.cpp

Page 33

? Copyright 2013 Xilinx
.

更复杂的OpenCV实例:快速角点
代码是“Streaming”
– 要注意函数不是1:1对应!
void opencv p _image g _filter(IplImage* p g src, IplImage* p g dst) { IplImage* gray = cvCreateImage( cvGetSize(src), 8, 1 ); IplImage* mask = cvCreateImage( cvGetSize(src), 8, 1 ); IplImage* dmask = cvCreateImage( cvGetSize(src), 8, 1 ); std::vector<cv::KeyPoint> 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 ); }
Page 34

hls::FASTX hl hls::PaintMask P i tM k

opencv_top.cpp
? Copyright 2013 Xilinx
.

更复杂的OpenCV实例:快速角点
可综合的代码
– 注意“#pragma HLS stream”
hls::Mat<MAX_HEIGHT,MAX_WIDTH,HLS_8UC3> _src(rows,cols); hl hls::Mat<MAX_HEIGHT,MAX_WIDTH,HLS_8UC3> M t<MAX HEIGHT MAX WIDTH HLS 8UC3> _dst(rows,cols); d t( l ) hls::AXIvideo2Mat(input, _src); hls::Mat<MAX_HEIGHT,MAX_WIDTH,HLS_8UC3> src0(rows,cols); hls::Mat<MAX_HEIGHT,MAX_WIDTH,HLS_8UC3> src1(rows,cols); # #pragma HLS stream t d depth=20000 th 20000 variable=src1.data_stream i bl 1 d t t hls::Mat<MAX_HEIGHT,MAX_WIDTH,HLS_8UC1> mask(rows,cols); hls::Mat<MAX_HEIGHT,MAX_WIDTH,HLS_8UC1> dmask(rows,cols); hls::Scalar<3,unsigned char> color(255,0,0); hls D plicate( src src0 src1) hls::Duplicate(_src,src0,src1); hls::Mat<MAX_HEIGHT,MAX_WIDTH,HLS_8UC1> gray(rows,cols); hls::CvtColor<HLS_BGR2GRAY>(src0,gray); hls::FASTX(gray,mask,20,true); hls::Dilate(mask dmask); hls::Dilate(mask,dmask); hls::PaintMask(src1,dmask,_dst,color); hls::Mat2AXIvideo(_dst, output); top.cpp

Page 35

? Copyright 2013 Xilinx
.

流与再收敛路径

hls::Mat从概念上讲代表一个完整图像,但以像素流的形式执行 从概念上讲代表 个完整图像 但以像素流的形式执行
l i i i l template<int ROWS, int COLS, int T> class Mat { public: HLS_SIZE_T rows, cols; hls::stream<HLS_TNAME(T)> data_stream[HLS_MAT_CN(T)]; } }; hls_video_core.h

快速角点包含一条 快速角点包含 条再收敛路径
– src1像素流必须包含足够的缓冲空间,用以匹配FASTX和Dilate的延迟 (大约10个视频行 * 1920像素)
CvtColor src1 FASTX Dilate PaintMask

#pragma HLS stream depth=20000 variable=src1.data_stream
第36页

? Copyright 2013 Xilinx
.

性能分析

AXI性能监视器可以从存储器带宽收集统计数据
– 请查看 /mnt/AXI_PerfMon.log

视频 + 快速角点
– 1920*1080*60*32 = ~4 Gb/s per stream – HP0: 读 4.01 Gb/s, 写 4.01 Gb/s, 总共 8.03 Gb/s – HP2: 读 4.01 Gb/s, 写 4.01 Gb/s, 总共 8.03 Gb/s

Page 37

? Copyright 2013 Xilinx
.

功耗分析
可从ZC702开发板上的数字调功器读取电压和电流。 用2-3 2 3瓦的系统总功耗即可实现定制的实时高清视频处理
– FASTX所增加的功耗不足 200mW

3000 2500 2000 1500 1000 500 0 Active Idle
第38页

DDR PL IO PL core PS IO PS core Idle + Video
.

Fast Corners + video

? Copyright 2013 Xilinx

HLS与Zynq加速OpenCV应用

O OpenCV C 函数可实现计算机视觉算法的快速原型设计 计算机视觉应用与生俱来的异构特性,使其需要软硬件相结合的实 现方案 Vivado HLS视频库能加快OpenCV函数向FPGA可编程架构的映 射 Zynq采用高性能可编程逻辑和嵌入式ARM内核,是一款功耗优化 的集成式解决方案

第39页

? Copyright 2013 Xilinx
.

其他有关OpenCV的补充资料

下载 XAPP1167 QuickTake系列视频: 使用 Vivado提升OpenCV和HLS

http://china.xilinx.com/hls http://china.xilinx.com/getlicense
Page 40

? Copyright 2013 Xilinx
.


相关文章:
多摄像头驾驶员辅助平台
Zynq-7000 All Programmable SoC 将 DA 系统中必需的典型传感、 环境功能描述和...Vivado HLS视频库加速Zy... 40页 1下载券 基于ZYNQ SoC的多轴运动... 暂无...
更多相关标签:
vivado zynq7000 教程 | vivado zynq | vivado zynq 教程 | vivado hls | vivado hls 教程 | vivado hls中文教程 | vivado hls是什么 | vivado hls opencv |