13

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

 3 years ago
source link: https://mp.weixin.qq.com/s/GVyP4iTy9UgUtfwc1KpRmw
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

点击上方“3D视觉工坊”,选择“星标”

干货第一时间送达



上次提到了事件相机的数据集和运行平台,这次我们运行第一个实例,从简单的入手:角点检测。一、事件相机Harris角点检测提到角点检测,非常出名的便是Harris角点,在传统图像领域使用非常多。但为了在事件相机的数据形式中使用,我们首先需要了解Harris角点检测的基本原理。1、Harris角点检测原理首先定义什么算是一个角点。Harris角点认为,在角点附近的区域中,无论沿任何方向移动图像,都会造成图像灰度的明显变化,那么这个点就是一个角点。注意到这里的描述提到了“任意”方向,也就是说,当单独有一条直线时,若沿着直线延伸方向移动,是不会造成图像灰度发生变化的,所以不是角点。接下来,为了从数学角度描述“移动导致图像灰度发生变化”,我们用目标函数E进行表示,Image表示图像I(·)经过(u,v)移动后在窗口W中的像素变化情况。变化越明显,E越大。我们认为在角点附近的权重应该大一些,则为E增加以(x,y)为中心的高斯权重Image。当完成数学定义后,我们进行数学上的变换。首先通过Taylor展开,将平方项中的第一个表示为当前像素和像素所在处梯度沿x和y方向强度Ix,Iy,以及偏移(u,v)的形式,则有:
640?wx_fmt=png

640?wx_fmt=png

从Harris定义来看,如果图像有明显变化,则说明在区域内应该既存在很大的Ix,也存在很大的Iy,且Ix,Iy的比例不能相同否则将只有沿某个角度的梯度。那么如何再一次用数学对这个问题进行描述?
640?wx_fmt=png
(图:3中像素分布情况(上排)与梯度分布(下排)情况)为此我们绘制区域内所有像素的沿x和y方向梯度的分布,即o-Ix-Iy下方示意图中,橙色方块表示3种不同的像素分布,黑色表示深色,白色为浅色,只有第一幅图中有角点,那么第一幅图的分布如下方坐标中红色点所示,在x轴和y轴某个值附近存在(由于噪声不会完全集中于一点),同时大部分区域没有梯度所以也有一部分集中在原点附近;同理对于第二个图,只有一部分像素点存在y方向梯度;对于图3,x和y方向都有梯度,但方向相同。利用PCA的思想,如果对这些分布点进行降维,那么主轴方向应该是椭圆的长半轴方向,且长度与特征值正比。由此,我们可以通过这些点PCA的特征值判断椭圆的性质:如果是细长的椭圆,则两个特征之中必然有一个接近0。对于有角点的第一种情况,椭圆很大且宽,所以两个特征值都很大。从数学表达上,我们需要保证两个特征值满足:640?wx_fmt=png定义表达式640?wx_fmt=png这个式子越大则意味着满足上述条件。同时我们注意到,对于M,由矩阵基本知识可知640?wx_fmt=png这意味着我们甚至不用求出M的特征值,直接用M即可计算出特征值满足的性质。那么我们整理Harris角点检测的方法如下:1. 计算图像区域在x和y方向上的梯度2. 根据M矩阵的形式,表示M矩阵3. 计算Harris响应值R,640?wx_fmt=png其中k为调增参数4. 若R大于一定阈值,则认为存在角点。2、基于事件相机的Harris角点检测有了传统图像的Harris检测基础后,可以直接迁移到事件相机的方法中。我们首先对一小段时间内的时间进行累积,如果某个像素发生了事件则记为1,否则为0。此时得到的图像应该是类似于边缘的信息,
640?wx_fmt=png
接下来采用Harris角点检测流程,按步骤进行计算即可,这里不再赘述。二、事件相机Fast角点检测说完Harris角点检测后,我们说一下另一种常用的角点检测方法,Fast角点检测。传统图像中,Fast角点检测方法可以概括为,某个点比附近一圈的连续多个像素要大/小,则认为是角点。那么对于事件相机而言,我们只能获得边缘信息,是无法获得闭区域内部的。如何解决?这里需要引入一个“活动事件表面”的概念(SAE, Surface of Active Events)。由于事件相机输出数据带有时间戳,所以当事件发生后,我们可以绘制一个三维坐标,自变量为像素坐标,因变量为事件的时间。由此在形成了一个表面,成为活动事件表面。下图示意了一个直角图案从“右上”往“左下”运动时产生的时间表面,最新发生的事件所对应的时间更晚,t值越大,高度越高。
640?wx_fmt=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.bagroslaunch corner_event_detector bag.launch可以发现角点检测程序在launch中自动启动了dvs_renderer节点,由此可以看到角点检测结果。

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK