Zynq学习笔记——HLS FAST corner导出keypoints(一)

 Zynq学习笔记——HLS FAST corner导出keypoints(一)

PC平台:WINDOWS 10 64位
Xilinx设计开发套件:Xilinx_vivado_sdk_2015.4
开发板:ZedBoard

之前参照XAPP1167文档,使用HLS Video函数库里的FASTX跑了一下例子,当时的例子是直接把keypoint以mask方式画在了原始视频图像上,应用层并没有获取到keypoint的坐标信息,所以无法开展下一步的图像处理,比如获取keypoint的特征点信息进行图像匹配等,其实HLS FASTX提供了两个函数,一个是返回keypoint的mask图像,另一个是返回keypoint数组,所以如果需要获取到keypoint的坐标信息,必须得使用第二个函数

 Zynq学习笔记——HLS FAST corner导出keypoints(一)

可以在Vivado HLS安装目录下找到FASTX的源代码,有两个地方,Xilinx\Vivado_HLS\2015.4\include\hls\hls_video_fast.h和Xilinx\Vivado_HLS\2015.4\common\technology\autopilot\hls\hls_video_fast.h
//generate array
template
void FAST_t_opr(
Mat &_src,
Point_ (&_keypoints)[N],
HLS_TNAME(SRC_T) _threshold,
bool _nonmax_supression,
int (&flag)[PSize][2]
)
{
typedef typename pixel_op_type::T INPUT_T;
LineBuffer k_buf;
LineBuffer<2,COLS+KERNEL_SIZE,ap_int<16> > core_buf;
Window<3,3,ap_int<16> > core_win;
Window win;
Scalar s;
int rows= _src.rows;
int cols= _src.cols;
assert(rows <= ROWS);
assert(cols <= COLS);
int kernel_half=KERNEL_SIZE/2;
ap_uint<2> flag_val[PSize+PSize/2+1];
int flag_d[PSize+PSize/2+1];
#pragma HLS ARRAY_PARTITION variable=flag_val dim=0
#pragma HLS ARRAY_PARTITION variable=flag_d dim=0
int index=0;
int offset=KERNEL_SIZE/2;

if(_nonmax_supression)
{
offset=offset+1;
}
loop_height: for(HLS_SIZE_T i=0;i=KERNEL_SIZE&&j>=KERNEL_SIZE&&core_win.val[1][1]!=0)
{
bool iscorner=fast_nonmax(core_win);
if(iscorner)
{
if(index > core_win;
Window win;
Scalar s;
int rows= _src.rows;
int cols= _src.cols;
assert(rows <= ROWS);
assert(cols <= COLS);
int kernel_half=KERNEL_SIZE/2;
ap_uint<2> flag_val[PSize+PSize/2+1];
int flag_d[PSize+PSize/2+1];
#pragma HLS ARRAY_PARTITION variable=flag_val dim=0
#pragma HLS ARRAY_PARTITION variable=flag_d dim=0

int index = 1;
int offset=KERNEL_SIZE/2;
int location =0;

if(_nonmax_supression)
{
offset=offset+1;
}
loop_height: for(HLS_SIZE_T i=0;i=cols)
{
core=0;
}
if(_nonmax_supression)
{
core_win.val[3-1][3-1]=core;
core_buf.val[3-2][j]=core;
if(i>=KERNEL_SIZE&&j>=KERNEL_SIZE&&core_win.val[1][1]!=0)
{
bool iscorner=fast_nonmax(core_win);
if(iscorner)
{
if(index<_len)
{
location = j-offset;
location <<= 16;
location |= i-offset;
_keypoints[index] = location;
index++;
}
}
}
}(_src,_keypoints,_len,_threshold,_nomax_supression,flag);
}

修改完FAST函数后,把原来的例子进行相应的修改
void hls_fast_corner(AXI_STREAM& INPUT_STREAM, AXI_STREAM& OUTPUT_STREAM, int rows, int cols, int threhold, int keypoints[MAX_KEYPOINTS])
{
#pragma HLS INTERFACE axis port=INPUT_STREAM
#pragma HLS INTERFACE axis port=OUTPUT_STREAM

#pragma HLS INTERFACE s_axilite port=rows bundle=BUS_CTRL
#pragma HLS INTERFACE s_axilite port=cols bundle=BUS_CTRL
#pragma HLS INTERFACE s_axilite port=threhold bundle=BUS_CTRL
#pragma HLS INTERFACE s_axilite port=keypoints bundle=BUS_CTRL

#pragma HLS INTERFACE s_axilite port=return bundle=BUS_CTRL

hls::Mat _src(rows,cols);
hls::Mat _dst(rows,cols);
#pragma HLS dataflow
hls::AXIvideo2Mat(INPUT_STREAM, _src);
hls::Mat src0(rows,cols);
hls::Mat src1(rows,cols);
hls::Mat gray(rows,cols);

hls::Duplicate(_src,src0,src1);

hls::CvtColor(src0,gray);

hls::FASTX(gray,keypoints, MAX_KEYPOINTS, threhold,true);

hls::Mat2AXIvideo(src1, OUTPUT_STREAM);
}

没有了paintmask,不能在图像上直接看到keypoint了,该如何验证呢,可以在testbench上使用cvCircle把keypoint画上去,代码如下:
int main (int argc, char** argv) {

IplImage* src = cvLoadImage(INPUT_IMAGE);
IplImage* dst = cvCreateImage(cvGetSize(src), src->depth, src->nChannels);

AXI_STREAM src_axi, dst_axi;
IplImage2AXIvideo(src, src_axi);

int threhold = 60;
int keypoints[MAX_KEYPOINTS];
hls_fast_corner(src_axi, dst_axi, src->height, src->width, threhold, keypoints);

AXIvideo2IplImage(dst_axi, dst);

int count = keypoints[0];
printf("keypoints count:%d\n", count);
for(int i=1;i> 16;
int y = (keypoints[i] & 0xFFFF);

用户喜欢...

使用Zynq UltraScale +器件开发防篡改设计

本应用笔记提供了防篡改(AT)指南和实际示例,以帮助保护ZynqUltraScale+器件支持的系统中可能存在的知识产权(IP)和敏感数据。 这种保护(以防篡改的形式)需要在Zynq UltraScale +器件通过软...


使用随时可用的硬件和软件开始机器学习

对于开发人员来说,机器学习(ML)硬件和软件的进步有望将这些复杂的方法带入物联网(IoT)边缘设备。然而,随着这一研究领域的发展,开发人员可以轻松地发现自己沉浸在这些技术背后的...


使用FPGA通过机器学习构建高性能嵌入式视觉应用

本文将介绍ML处理的要求以及FPGA解决许多性能问题的原因。然后,它将介绍一个合适的基于FPGA的ML平台以及如何使用它。...


使用 FPGA 构建具有机器学习能力的高性能嵌入式视觉应用

随着摄像头和其他设备产生的数据在快速增长,促使人们运用机器学习从汽车、安防和其他应用产生的影像中提取更多有用的信息。专用器件有望在嵌入式视觉应用中实现高性能机器学习 (ML...


Zynq 7015 linux跑起来之导入u-boot移植

获得u-boot源码 https://github.com/xilinx/u-boot-xlnx 我直接使用git clone来获取 新建一个用于存放u-boot的目录 git clone https://github.com/Xilinx/u-boot-xlnx.git 然后就开始下载了。 解压成功,进入到uboot源码。...


RohdeSchwarz便携式4.0GHz的频谱分析仪里面的Zynq AP SoC

背景: 无论是在实验室调试嵌入式设备,还是在外场解决复杂的问题,都需要一款便携式的频谱分析仪,在要求有高性能和较宽的测试范围的同时,我们还希望这个仪器有着较小的功耗,这...


Aldec的边缘计算示例: Zynq SoC 的 FPGA架构将嵌入式视觉/ ADAS性能提升了10倍

Aldec的一个应用工程师 Farhad Fallah 在 New Electronics 网站上发表的一篇题​​为生活在边缘的文章最近引起了我的注意,因为它简洁地描述了为什么 FPGA 对于许多高性能的边缘计算应用如此有用...


英国伯明翰大学团队使用Theano,Python,PYNQ和Zynq开发定点Deep Recurrent神经网络

可编程逻辑(PLD)是由一种通用的集成电路产生的,逻辑功能按照用户对器件编程来确定,用户可以自行编程把数字系统集成在PLD中。经过多年的发展,可编程逻辑器件由70年代的可编程逻辑阵...


Zynq 7015 linux跑起来之导入SDK生成FSBL

上一节相当于成功生成了PS部分,这一部分利用上一步生成的文件来导入到SDK中。 在vivado中点File->Export Hardware我这里把Include bitstream给勾上了。 然后File->Launch SDK 点OK,稍等一下,就会跳出SDK,...


在机器学习的应用上,软件工程师和FPGA真的有着难以逾越的鸿沟吗?

人工智能和机器学习正在渗透所有的行业。随着人工智能算法的成熟,支持这些算法的硬件平台也日趋成熟。目前,这些硬件平台包括 ASIC,CPU,GPU以及 FPGA 。在 Plunify,尽管我们的强项是F...


成为一名机器学习算法工程师,需要具备哪些技能?

成为一名合格的开发工程师不是一件简单的事情,需要掌握从开发到调试到优化等一系列能力,这些能力中的每一项掌握起来都需要足够的努力和经验。而要成为一名合格的机器学习算法工程...


揭示 Aaware Zynq 加速的远程声音捕捉平台背后的秘密

高性能的语音控制系统在智能家具和机器人的发展过程中显得越来越重要。语音控制系统的信号采集端使用麦克风阵列会得到更丰富的声音信号,为声音定位提供了可能,处理语音的硬件的性...


Amazon Alexa和Google Home语言系统的前驱服务者:13个MEMS 麦克风+Zynq SoC

背景: 说到语音识别,吸引的大家关注的有两大主力:亚马逊的Alexa和Google伴的Home。首先说说Alexa,随着智能家居Echo受到热捧,亚马逊的语音私人助手Alexa持续受到消费者关注。Alexa能围绕着...


25G 互连演示:Kintex、Virtex 和 Zynq UltraScale+ 器件

面向专业音视频及广播的突破性收发器技术 视频质量从 1080p 到 4K60 的提升以及通过标准以太网进行 IP 视频传输(25G、40G 和 100G)的日益增多,为广播及专业音视频终端及基础设施带来了短期...


小板子大智谋——Aldec公司的TySOM-3-ZUEV囊括了Zynq UltraScale+ MPSoC,DDR4 SoDIMM,WiFi,Bluetooth,HDMI,FMC等等单元于一身

背景: 你需要将大量的嵌入式资源放到一个很小的空间里面么?如果需要,那么你不妨看一下Aldec TySOM-3-ZU7EV这款嵌入式的业界新宠,它将Xilinx Zynq UltraScale+ ZU7EV MPSoC以及DDR4 SoDIMM,WiFi,蓝牙...


Xilinx Zynq开发--修改官方的根文件系统

#前段时间在做zynq702评估的时候,提出了一种省事的制作和修改根文件系统的方法: #用dd命令将官方uramdisk----->ramdisk #或者直接用官方的ramdisk ,解压后得到ramdisk.image #1.将ramdisk 挂载到/mnt下...