请选择 进入手机版 | 继续访问电脑版
[X]关闭
0

S04-CH11 快速角点检测之硬件实现

摘要: 本章向大家介绍了如何利用HLS来实现快速角点检测算法,快速角点检测可以用于特征提取,因此具有很大的实用性,最后利用我们的开发板对其进行了验证,通过本章,大家应该掌握利用HLS来进行基本的算法开发,这也将大大 ...

软件版本:VIVADO2017.4

操作系统:WIN10 64bit

硬件平台:适用米联客 ZYNQ系列开发板

米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问!!

11.1 概述

       本章向大家介绍了如何利用HLS来实现快速角点检测算法,快速角点检测可以用于特征提取,因此具有很大的实用性,最后利用我们的开发板对其进行了验证,通过本章,大家应该掌握利用HLS来进行基本的算法开发,这也将大大的节省我们的开发时间。

11.2 角点定义

       角点检测(Corner Detection)是计算机视觉系统中用来获得图像特征的一种方法,广泛应用于运动检测、图像匹配、视频跟踪、三维建模和目标识别等领域中。也称为特征点检测。
角点通常被定义为两条边的交点,更严格的说,角点的局部邻域应该具有两个不同区域的不同方向的边界。而实际应用中,大多数所谓的角点检测方法检测的是拥有特定特征的图像点,而不仅仅是“角点”。这些特征点在图像中有具体的坐标,并具有某些数学特征,如局部最大或最小灰度、某些梯度特征等。
现有的角点检测算法并不是都十分的鲁棒。很多方法都要求有大量的训练集和冗余数据来防止或减少错误特征的出现。角点检测方法的一个很重要的评价标准是其对多幅图像中相同或相似特征的检测能力,并且能够应对光照变化、图像旋转等图像变化。

      在我们解决问题时,往往希望找到特征点,“特征”顾名思义,指能描述物体本质的东西,还有一种解释就是这个特征微小的变化都会对物体的某一属性产生重大的影响。而角点就是这样的特征。
观察日常生活中的“角落”就会发现,“角落”可以视为所有平面的交汇处,或者说是所有表面的发起处。假设我们要改变一个墙角的位置,那么由它而出发的平面势必都要有很大的变化。所以,这就引出了图像角点的定义,“如果某一点在任意方向的一个微小变动都会引起灰度很大的变化,那么我们就把它称之为角点”

      特征检测与匹配是Computer Vision 应用中重要的一部分,这需要寻找图像之间的特征建立对应关系。点,也就是图像中的特殊位置,是很常用的一类特征,点的局部特征也可以叫做“关键特征点”(keypoint feature),或“兴趣点”(interest point),或“角点”(conrner)。

关于角点的具体描述可以有几种:

  1. 一阶导数(即灰度的梯度)的局部最大所对应的像素点;
  2. 两条及两条以上边缘的交点;
  3. 图像中梯度值和梯度方向的变化速率都很高的点;
  4. 角点处的一阶导数最大,二阶导数为零,指示物体边缘变化不连续的方向。

11.3 角点检测算法

11.3.1 Moravec角点检测算法

      Moravec角点检测算法是最早的角点检测算法之一。该算法将角点定义为具有低“自相关性”的点。算法会检测图像的每一个像素,将像素周边的一个邻域作为一个patch,并检测这个patch和周围其他patch的相关性。这种相关性通过两个patch间的平方差之和(SSD)来衡量,SSD值越小则相似性越高。
如果像素位于平滑图像区域内,周围的patch都会非常相似。如果像素在边缘上,则周围的patch在与边缘正交的方向上会有很大差异,在与边缘平行的方向上则较为相似。而如果像素是各个方向上都有变化的特征点,则周围所有的patch都不会很相似。Moravec会计算每个像素patch和周围patch的SSD最小值作为强度值,取局部强度最大的点作为特征点。

11.3.2 Harris角点检测

      当一个窗口在图像上移动,在平滑区域如图(a),窗口在各个方向上没有变化。在边缘上如图(b),窗口在边缘的方向上没有变化。在角点处如图(c),窗口在各个方向上具有变化。Harris角点检测正是利用了这个直观的物理现象,通过窗口在各个方向上的变化程度,决定是否为角点。

将图像窗口平移[u,v]产生灰度变化E(u,v)

 

11.3.3 FAST角点检测算法

      Smith 和 Brady在1997年提出了一种完全不同的角点提取方法,即“SUSAN (Smallest UnivalueSegment AssimilatingNucleus)”提取算子。SUSAN 提取算子的基本原理是,与每一图像点相关的局部区域具有相同的亮度。如果某一窗口区域内的每一像元亮度值与该窗口中心的像元亮度值相同或相似,这一窗口区域将被称之为“USAN”。计算图像每一像元的“USAN”,为我们提供了是否有边缘的方法。位于边缘上的像元的“USAN”较小,位于角点上的像元的“USAN”更小。因此,我们仅需寻找最小的“USAN”,就可确定角点。该方法由于不需要计算图像灰度差,因此,具有很强的抗噪声的能力。

      Edward Rosten and TomDrummond 在2006年提出了一种简单快速的角点探测算法,该算法检测的角点定义为在像素点的周围邻域内有足够多的像素点与该点处于不同的区域。应用到灰度图像中,即有足够多的像素点的灰度值大于该点的灰度值或者小于该点的灰度值。

      考虑下图中p点附近半径为3的圆环上的16个点,一个思路是若其中有连续的12个点的灰度值与p点的灰度值差别超过某一阈值,则可以认为p点为角点。

      这一思路可以使用机器学习的方法进行加速。对同一类图像,例如同一场景的图像,可以在16个方向上进行训练,得到一棵决策树,从而在判定某一像素点是否为角点时,不再需要对所有方向进行检测,而只需要按照决策树指定的方向进行2-3次判定即可确定该点是否为角点。

     在本章节的HLS实现中我们主要介绍FAST角点检测,很多传统的算法都很耗时,而且特征点检测算法只是很多复杂图像处理里中的第一步,得不偿失。FAST特征点检测是公认的比较快速的特征点检测方法,只利用周围像素比较的信息就可以得到特征点,简单,有效。

     FAST特征检测算法来源于corner的定义,这个定义基于特征点周围的图像灰度值,检测候选特征点周围一圈的像素值,如果候选点周围领域内有足够多的像素点与该候选点的灰度值差别够大,则认为该候选点为一个特征点。

     其中I(x)为圆周上任意一点的灰度,I(p)为圆心的灰度,Ed为灰度值差得阈值,如果N大于给定阈值,一般为周围圆圈点的四分之三,则认为p是一个特征点。

11.4 HLS实现

11.4.1 工程创建

Step1:打开HLS,按照之前介绍的方法,创建一个新的工程,命名为fast_corner。

Step2:右单击Source选项,选择New File,创建一个名为Top.cpp的文件。

Step3:在打开的编辑区中,把下面的程序拷贝进去:

#include "top.h"

 

void hls_fast_corner(AXI_STREAM& INPUT_STREAM, AXI_STREAM& OUTPUT_STREAM, int rows, int cols, int threhold)

{

//Create AXI streaming interfaces for the core

#pragma HLS INTERFACE axis port=INPUT_STREAM

#pragma HLS INTERFACE axis port=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=threhold 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

#pragma HLS INTERFACE ap_stable port=threhold

 

RGB_IMAGE      _src(rows,cols);

RGB_IMAGE      _dst(rows,cols);

RGB_IMAGE      src0(rows,cols);

RGB_IMAGE      src1(rows,cols);

GRAY_IMAGE     mask(rows,cols);

GRAY_IMAGE     dmask(rows,cols);

GRAY_IMAGE     gray(rows,cols);

 

#pragma HLS dataflow

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

hls::AXIvideo2Mat(INPUT_STREAM, _src);

hls::Scalar<3,unsigned char> color(255,0,0);

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

hls::CvtColor<HLS_BGR2GRAY>(src0,gray);

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

hls::Dilate(mask,dmask);

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

hls::Mat2AXIvideo(_dst, OUTPUT_STREAM);

}

Step4:再在Source中添加一个名为Top.h的库函数,并添加如下程序:

#ifndef _TOP_H_

#define _TOP_H_

 

#include "hls_video.h"

 

// maximum image size

#define MAX_WIDTH  1920

#define MAX_HEIGHT 1080

 

// I/O Image Settings

#define INPUT_IMAGE           "test_1080p.bmp"

#define OUTPUT_IMAGE          "result.bmp"

#define OUTPUT_IMAGE_GOLDEN   "result_golden.bmp"

 

// typedef video library core structures

typedef hls::stream<ap_axiu<32,1,1,1> >               AXI_STREAM;

typedef hls::Scalar<3, unsigned char>                 RGB_PIXEL;

typedef hls::Mat<MAX_HEIGHT, MAX_WIDTH, HLS_8UC3>     RGB_IMAGE;

typedef hls::Mat<MAX_HEIGHT, MAX_WIDTH, HLS_8UC1>     GRAY_IMAGE;

 

// top level function for HW synthesis

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

 

#endif

Step5:在Test Bench中,用同样的方法添加一个名为Test.cpp的测试程序。添加如下代码:

#include "hls_opencv.h"

#include "top.h"

 

using namespace cv;

 

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

    IplImage* src = cvLoadImage(INPUT_IMAGE);

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

    cvShowImage("hls_src", src);

 

//HLS视频库处理

    AXI_STREAM  src_axi, dst_axi;

    IplImage2AXIvideo(src, src_axi);

    hls_fast_corner(src_axi, dst_axi, src->height, src->width, 20);

    AXIvideo2IplImage(dst_axi, dst);

    cvShowImage("hls_dst", dst);

cvSaveImage(OUTPUT_IMAGE,dst);

waitKey(0);

 

    return 0;

}

Step6:在Test Bench中添加一张名为test_1080P.bmp的测试图片,图片可以在我们提供的源程序中的Image文件夹中找到。完整的工程如下图所示:

11.4.2 仿真及优化

Step1:单击Project settings快捷键。

Step2:选择Synthesis选项,然后点击Browse..指定一个顶层函数。

Step3:选定hls_fast_corner为顶层函数,然后点击OK。

Step4:再次单击OK,完成工程的修改。

综合报告如下:

1

路过

雷人

握手

鲜花

鸡蛋

刚表态过的朋友 (1 人)

最新评论

本文作者
2019-9-17 11:04
  • 1
    粉丝
  • 3351
    阅读
  • 0
    回复

关注米联客

扫描关注,了解最新资讯

联系人:汤经理
电话:0519-80699907
EMAIL:270682667@qq.com
地址:常州溧阳市天目云谷3号楼北楼201B

关注米联客

扫描关注,了解最新资讯

联系人:汤经理
电话:0519-80699907
EMAIL:270682667@qq.com
地址:常州溧阳市天目云谷3号楼北楼201B

关注米联客

扫描关注,了解最新资讯

联系人:汤经理
电话:0519-80699907
EMAIL:270682667@qq.com
地址:常州溧阳市天目云谷3号楼北楼201B
热门评论
排行榜