小凡 · 2020年05月09日

事件相机角点检测,从原理到demo

作者: 董岩
首发:3D视觉工坊微信公众号

上次提到了事件相机的数据集和运行平台,这次我们运行第一个实例,从简单的入手:角点检测。

一、事件相机Harris角点检测

提到角点检测,非常出名的便是Harris角点,在传统图像领域使用非常多。但为了在事件相机的数据形式中使用,我们首先需要了解Harris角点检测的基本原理。

1、Harris角点检测原理

首先定义什么算是一个角点。Harris角点认为,在角点附近的区域中,无论沿任何方向移动图像,都会造成图像灰度的明显变化,那么这个点就是一个角点。注意到这里的描述提到了“任意”方向,也就是说,当单独有一条直线时,若沿着直线延伸方向移动,是不会造成图像灰度发生变化的,所以不是角点。

接下来,为了从数学角度描述“移动导致图像灰度发生变化”,我们用目标函数E进行表示,image.png表示图像I(·)经过(u,v)移动后在窗口W中的像素变化情况。变化越明显,E越大。我们认为在角点附近的权重应该大一些,则为E增加以(x,y)为中心的高斯权重image.png

当完成数学定义后,我们进行数学上的变换。首先通过Taylor展开,将平方项中的第一个表示为当前像素和像素所在处梯度沿x和y方向强度Ix,Iy,以及偏移(u,v)的形式,则有:

image.png

从Harris定义来看,如果图像有明显变化,则说明在区域内应该既存在很大的Ix,也存在很大的Iy,且Ix,Iy的比例不能相同否则将只有沿某个角度的梯度。那么如何再一次用数学对这个问题进行描述?

image.png

(图:3中像素分布情况(上排)与梯度分布(下排)情况)

为此我们绘制区域内所有像素的沿x和y方向梯度的分布,即o-Ix-Iy下方示意图中,橙色方块表示3种不同的像素分布,黑色表示深色,白色为浅色,只有第一幅图中有角点,那么第一幅图的分布如下方坐标中红色点所示,在x轴和y轴某个值附近存在(由于噪声不会完全集中于一点),同时大部分区域没有梯度所以也有一部分集中在原点附近;同理对于第二个图,只有一部分像素点存在y方向梯度;对于图3,x和y方向都有梯度,但方向相同。

利用PCA的思想,如果对这些分布点进行降维,那么主轴方向应该是椭圆的长半轴方向,且长度与特征值正比。由此,我们可以通过这些点PCA的特征值判断椭圆的性质:如果是细长的椭圆,则两个特征之中必然有一个接近0。对于有角点的第一种情况,椭圆很大且宽,所以两个特征值都很大。从数学表达上,我们需要保证两个特征值满足:image.png定义表达式image.png这个式子越大则意味着满足上述条件。同时我们注意到,对于M,由矩阵基本知识可知image.png这意味着我们甚至不用求出M的特征值,直接用M即可计算出特征值满足的性质。

那么我们整理Harris角点检测的方法如下:

1. 计算图像区域在x和y方向上的梯度

2. 根据M矩阵的形式,表示M矩阵

3. 计算Harris响应值R,image.png其中k为调增参数

4. 若R大于一定阈值,则认为存在角点。

2、基于事件相机的Harris角点检测

有了传统图像的Harris检测基础后,可以直接迁移到事件相机的方法中。

我们首先对一小段时间内的时间进行累积,如果某个像素发生了事件则记为1,否则为0。此时得到的图像应该是类似于边缘的信息,
image.png
接下来采用Harris角点检测流程,按步骤进行计算即可,这里不再赘述。

二、事件相机Fast角点检测

说完Harris角点检测后,我们说一下另一种常用的角点检测方法,Fast角点检测。传统图像中,Fast角点检测方法可以概括为,某个点比附近一圈的连续多个像素要大/小,则认为是角点。那么对于事件相机而言,我们只能获得边缘信息,是无法获得闭区域内部的。如何解决?这里需要引入一个“活动事件表面”的概念(SAE, Surface of Active Events)。

由于事件相机输出数据带有时间戳,所以当事件发生后,我们可以绘制一个三维坐标,自变量为像素坐标,因变量为事件的时间。由此在形成了一个表面,成为活动事件表面。下图示意了一个直角图案从“右上”往“左下”运动时产生的时间表面,最新发生的事件所对应的时间更晚,t值越大,高度越高。

image.png

(图:活动事件表面 和 角点检测时比较的圆圈)

如此,我们可以根据这样判断是否为一个角点:中心点的时间戳,连续远大于/小于周围一圈事件的时间戳,则认为是一个角点。那么这个圆圈选多大呢?论文表明,由于噪声影响,我们选两个圆圈,分别是半径为3和4像素(上图右侧)。如果对于3像素半径,有3-6个连续远大于/小于周围的像素,且4像素半径,有4-8个连续远大于/小于周围的像素,则认为是角点。

三、运行第一个demo

上次我们配置了ROS环境下的获取数据集并绘图的代码,rpg\_dvs\_ros,这次我们要使用这个实现我们第一个demo:角点检测。(详细过程可参考github:https://github.com/uzh-rpg/rpg\_corner\_events)

首先下载角点检测代码(这个代码实现了Fast和Harris两种检测方法):

git clone https://github.com/uzh-rpg/rpg\_corner\_events

之后回到ros工作环境根目录进行编译

catkin build

之后运行数据集和角点检测程序

rosbag play shapes\_6dof.bag

roslaunch corner\_event\_detector bag.launch

可以发现角点检测程序在launch中自动启动了dvs\_renderer节点,由此可以看到角点检测结果。

image.png

(_图:原始事件相机图像和角点检测结果)_

四、结语

角点检测是一个较为基础的任务,在了解原理后可以轻松的进行实现。对于事件相机而言,信息的不完整性以及噪声造成了角点检测的困难和精度的下降。相信会不断提出更合适的角点检测方法。

至此我们已经能够在ROS下运行现有的package。下一篇推送,将介绍如何自己编写一个package,实现简单的任务。

参考文献:

1. Fast Event-based Harris Corner Detection Exploiting the Advantages of Event-driven Cameras

2. Fast Event-based Corner Detection

推荐阅读


重点介绍:1、3D视觉算法;2、vslam算法;3、图像处理;4、深度学习;5、自动驾驶;6、技术干货。博主及合伙人分别来国内自知名大厂、海康研究院,深研3D视觉、深度学习、图像处理、自动驾驶、目标检测、VSLAM算法等领域。
欢迎关注微信公众号
3D与Slam 二维码 极术.jpg
推荐阅读
关注数
1104
内容数
100
专注于3D视觉,Vslam,图像处理等,欢迎关注
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息