作者: 董岩
首发:3D视觉工坊微信公众号
上次提到了事件相机的数据集和运行平台,这次我们运行第一个实例,从简单的入手:角点检测。
一、事件相机Harris角点检测
提到角点检测,非常出名的便是Harris角点,在传统图像领域使用非常多。但为了在事件相机的数据形式中使用,我们首先需要了解Harris角点检测的基本原理。
1、Harris角点检测原理
首先定义什么算是一个角点。Harris角点认为,在角点附近的区域中,无论沿任何方向移动图像,都会造成图像灰度的明显变化,那么这个点就是一个角点。注意到这里的描述提到了“任意”方向,也就是说,当单独有一条直线时,若沿着直线延伸方向移动,是不会造成图像灰度发生变化的,所以不是角点。
接下来,为了从数学角度描述“移动导致图像灰度发生变化”,我们用目标函数E进行表示,表示图像I(·)经过(u,v)移动后在窗口W中的像素变化情况。变化越明显,E越大。我们认为在角点附近的权重应该大一些,则为E增加以(x,y)为中心的高斯权重。
当完成数学定义后,我们进行数学上的变换。首先通过Taylor展开,将平方项中的第一个表示为当前像素和像素所在处梯度沿x和y方向强度Ix,Iy,以及偏移(u,v)的形式,则有:
从Harris定义来看,如果图像有明显变化,则说明在区域内应该既存在很大的Ix,也存在很大的Iy,且Ix,Iy的比例不能相同否则将只有沿某个角度的梯度。那么如何再一次用数学对这个问题进行描述?
(图:3中像素分布情况(上排)与梯度分布(下排)情况)
为此我们绘制区域内所有像素的沿x和y方向梯度的分布,即o-Ix-Iy下方示意图中,橙色方块表示3种不同的像素分布,黑色表示深色,白色为浅色,只有第一幅图中有角点,那么第一幅图的分布如下方坐标中红色点所示,在x轴和y轴某个值附近存在(由于噪声不会完全集中于一点),同时大部分区域没有梯度所以也有一部分集中在原点附近;同理对于第二个图,只有一部分像素点存在y方向梯度;对于图3,x和y方向都有梯度,但方向相同。
利用PCA的思想,如果对这些分布点进行降维,那么主轴方向应该是椭圆的长半轴方向,且长度与特征值正比。由此,我们可以通过这些点PCA的特征值判断椭圆的性质:如果是细长的椭圆,则两个特征之中必然有一个接近0。对于有角点的第一种情况,椭圆很大且宽,所以两个特征值都很大。从数学表达上,我们需要保证两个特征值满足:定义表达式这个式子越大则意味着满足上述条件。同时我们注意到,对于M,由矩阵基本知识可知这意味着我们甚至不用求出M的特征值,直接用M即可计算出特征值满足的性质。
那么我们整理Harris角点检测的方法如下:
1. 计算图像区域在x和y方向上的梯度
2. 根据M矩阵的形式,表示M矩阵
3. 计算Harris响应值R,其中k为调增参数
4. 若R大于一定阈值,则认为存在角点。
2、基于事件相机的Harris角点检测
有了传统图像的Harris检测基础后,可以直接迁移到事件相机的方法中。
我们首先对一小段时间内的时间进行累积,如果某个像素发生了事件则记为1,否则为0。此时得到的图像应该是类似于边缘的信息,
接下来采用Harris角点检测流程,按步骤进行计算即可,这里不再赘述。
二、事件相机Fast角点检测
说完Harris角点检测后,我们说一下另一种常用的角点检测方法,Fast角点检测。传统图像中,Fast角点检测方法可以概括为,某个点比附近一圈的连续多个像素要大/小,则认为是角点。那么对于事件相机而言,我们只能获得边缘信息,是无法获得闭区域内部的。如何解决?这里需要引入一个“活动事件表面”的概念(SAE, Surface of Active Events)。
由于事件相机输出数据带有时间戳,所以当事件发生后,我们可以绘制一个三维坐标,自变量为像素坐标,因变量为事件的时间。由此在形成了一个表面,成为活动事件表面。下图示意了一个直角图案从“右上”往“左下”运动时产生的时间表面,最新发生的事件所对应的时间更晚,t值越大,高度越高。
(图:活动事件表面 和 角点检测时比较的圆圈)
如此,我们可以根据这样判断是否为一个角点:中心点的时间戳,连续远大于/小于周围一圈事件的时间戳,则认为是一个角点。那么这个圆圈选多大呢?论文表明,由于噪声影响,我们选两个圆圈,分别是半径为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节点,由此可以看到角点检测结果。
(_图:原始事件相机图像和角点检测结果)_
四、结语
角点检测是一个较为基础的任务,在了解原理后可以轻松的进行实现。对于事件相机而言,信息的不完整性以及噪声造成了角点检测的困难和精度的下降。相信会不断提出更合适的角点检测方法。
至此我们已经能够在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算法等领域。
欢迎关注微信公众号