专栏首页科学计算VSLAM前端:图像特征提取

VSLAM前端:图像特征提取

VSLAM前端:图像特征提取

一、图像特征点

 视觉里程计主要是通过图像对运动进行估计。一副中等分辨率的图像就是一个维度巨大的矩阵,我们无法对矩阵直接进行估计,其面临的将是海量的计算,因此我们有必要对图像进行特征提取。特征就是图像中比较特别的地方,例如:角点、边缘等等,并且这些角点在相机运动及不同光照下应该保持稳定。

 特征点由关键点(keyPoint)与描述子(descriptor)组成,关键点是指二维图像中的坐标,描述子是指方向,大小等关键点的信息描述。时至今日,学者们已经提出了非常多的图像特征,常见的有:Harris,SIFT,SURF,ORB等等。虽然很多特征提取方法精度及鲁棒性很好,但其计算量巨大,明显不适合在当前使用。我们适当降低精度和鲁棒性,选择ORB特征作为图像特征提取方法,其余方法我们不展开介绍,感兴趣的读者自行了解。

 ORB特征由FAST关键点和BRIEF描述子构成,我们先来介绍FAST( Features from Accelerated Segments Test )角点的提取。

 上图为FAST角点的示意图,其核心思想是检测角点周围的灰度情况,速度非常快。给定一个像素坐标

p

,将他的亮度记作

I_p

,我们设置一个阈值

t

,然后选取以

p

为中心,半径为3的圆上的16个像素点。按照下式进行状态计算:

\begin{equation} \left\{\begin{aligned} &darker, &I_x \leq I_p-t \\ &similar, &I_p-t < I_x < I_p+t \\ &brighter, &I_p+t \leq I_x \\ \end{aligned} \right. \end{equation}

 如果有连续的

N

个点状态为darker或brighter,则认为

p

为关键点。通常

N

取12,为了加速计算,通常对1,5,9,13首先进行检测,满足条件后才进行灰度判断。通常检测完成后,还需要再使用非极大值抑制(NMS)再处理一次,避免出现多个角点的情况发生。

 FAST角点不具有尺度及方向性。针对尺度问题通常通过构建如下的图像金字塔来解决,在每一层金字塔进行检测,并通过距离阈值进行筛选。ORB中针对方向性采用质心法进行了改进,感兴趣的读者,可以阅读ORB-SLAM v3源码或者高翔的《视觉slam十四讲》。

 BRIEF描述子是一种二进制描述子,由0或1构成,其在特征点法的SLAM框架中较为常见。笔者现在从自动驾驶转到了AR方向,也使用光流跟踪取代了描述子匹配,故在此不展开BRIEF的介绍,感兴趣的读者阅读源码即可。

 上图为TUM数据集双目鱼眼相机提取的FAST角点可视图。程序编码我们使用openCV作为工具,实现很简单,这里不给出具体代码了。筛选FAST角点经常使用到harris响应,我们在这里再介绍一下harris角点,关注ORB-SLAM的同学可以忽略harris响应了。

二、harris响应

 harris响应建立在像素附近像素在梯度及幅值上均有较大的变化。基本思想是:选用窗口函数在图像上任意滑动,如果灰度变化较大,则认为有角点的存在。

 假设窗口函数为

\omega(x,y)

I(x,y)

表示图像滑动前的灰度值,

I(x+u,y+v)

表示图像滑动后的灰度值,

(u,v)

表示窗口平移量,像素在滑动窗口内的变化量为:

E(u,v)=\sum_{x,y}\omega(x,y)[I(x+u,y+v)-I(x,y)]^2

 对上式进行泰勒展开:

\sum[I(x+u,y+v)-I(x,y)]^2
\approx\sum[I(x,y)+uI_x+vI_y-I(x,y)]^2
=\sum(u^2I_x^2+2uvI_xI_y+v^2I_y^2)
=\sum \begin{bmatrix}u & v\end{bmatrix} \begin{bmatrix}I_x^2 & I_xI_y \\ I_xI_y & I_y^2\end{bmatrix} \begin{bmatrix}u \\ v\end{bmatrix}
=\begin{bmatrix}u & v\end{bmatrix}(\sum \begin{bmatrix}I_x^2 & I_xI_y \\ I_xI_y & I_y^2\end{bmatrix}) \begin{bmatrix}u \\ v\end{bmatrix}

 中间矩阵的

I_x,I_y

分别表示像素在两个方向上的梯度。一般来说,矩阵对应的两个特征值如果都大,则窗口内含有角点;如果一大一小,则是边缘;如果都很小,则为平面。harris角点将特征值计算隐含到了harris响应

R

当中,可通过harris响应直接对含有角点直接进行判断。

R=det(\begin{bmatrix}I_x^2 & I_xI_y \\ I_xI_y & I_y^2\end{bmatrix})-k(trace(\begin{bmatrix}I_x^2 & I_xI_y \\ I_xI_y & I_y^2\end{bmatrix}))^2

 其中

k

取0.04-0.06。

static void HarrisResponses(const Mat& img, vector<KeyPoint>& pts, int blockSize, float harris_k)
{
    //CV_Assert() means if the value in() is false,return a mistake message
    CV_Assert( img.type() == CV_8UC1 && blockSize*blockSize <= 2048 );

    size_t ptidx, ptsize = pts.size();

    const uchar* ptr00 = img.ptr<uchar>(); // get the ptr00 row in image
    int step = (int)(img.step/img.elemSize1());// the number of bytes of a element' one channel
    int r = blockSize/2; // circle radius R 

    float scale = (1 << 2) * blockSize * 255.0f;
    scale = 1.0f / scale;
    float scale_sq_sq = scale * scale * scale * scale;

    AutoBuffer<int> ofsbuf(blockSize*blockSize);
    int* ofs = ofsbuf;
    for( int i = 0; i < blockSize; i++ )
        for( int j = 0; j < blockSize; j++ )
            ofs[i*blockSize + j] = (int)(i*step + j);

    for( ptidx = 0; ptidx < ptsize; ptidx++ )
    {
        int x0 = cvRound(pts[ptidx].pt.x - r);
        int y0 = cvRound(pts[ptidx].pt.y - r);

        const uchar* ptr0 = ptr00 + y0*step + x0;
        int a = 0, b = 0, c = 0;

        for( int k = 0; k < blockSize*blockSize; k++ )
        {
            const uchar* ptr = ptr0 + ofs[k];
            int Ix = (ptr[1] - ptr[-1])*2 + (ptr[-step+1] - ptr[-step-1]) + (ptr[step+1] - ptr[step-1]);
            int Iy = (ptr[step] - ptr[-step])*2 + (ptr[step-1] - ptr[-step-1]) + (ptr[step+1] - ptr[-step+1]);
            a += Ix*Ix;
            b += Iy*Iy;
            c += Ix*Iy;
        }

        // Harris response function
        pts[ptidx].response = ((float)a * b - (float)c * c -
                               harris_k * ((float)a + b) * ((float)a + b))*scale_sq_sq;
    }
}

本文分享自微信公众号 - 科学计算technomania(Quant_Times),作者:大亮

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-04-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 图像局部特征提取

    图像特征可以包括颜色特征、纹理特征、形状特征以及局部特征点等。其中局部特点具有很好的稳定性,不容易受外界环境的干扰。图像特征提取是图像分析与图像识别的前提,它是...

    范中豪
  • vSLAM开发指南:从技术框架、开源算法到硬件选型!

    出品 | 智东西公开课 讲师 | 小觅智能 CTO 杨瑞翾 编辑 | 王鑫

    小白学视觉
  • 视觉/视觉惯性SLAM最新综述:领域进展、方法分类与实验对比

    Visual and Visual-Inertial SLAM: State of the Art, Classification,and Experiment...

    3D视觉工坊
  • 视觉/视觉惯性SLAM最新综述:领域进展、方法分类与实验对比

    Visual and Visual-Inertial SLAM: State of the Art, Classification,and Experiment...

    计算机视觉
  • 图像处理之特征提取

    知乎上看到一个话题—— 目前火热的 Deep Learning 会灭绝传统的 SIFT / SURF 特征提取方法吗? ---- 由于之前研究过SIFT和HO...

    echobingo
  • Hog图像特征提取算法,HOG

    HOG全称:方向梯度直方图(Histogram of Oriented Gradient),发表于2005年的CVPR,是一种图像特征提取算法,和SVM分类器结...

    云深无际
  • 【SLAM】开源 | Good Graph提高了VSLAM估计的准确性和鲁棒性,及基于VSLAM的闭环导航系统的轨迹跟踪性能!

    论文地址: http://arxiv.org/pdf/2008.10123v1.pdf

    CNNer
  • AR设备单目视觉惯导SLAM算法综述与评价

    标题:Survey and evaluation of monocular visual-inertial SLAM algorithms for augmen...

    点云PCL博主
  • 专栏 | 对比激光SLAM与视觉SLAM:谁会成为未来主流趋势?

    机器之心
  • vSLAM技术综述

    SLAM是“Simultaneous Localization And Mapping”的缩写,可译为同步定位与建图。概率 SLAM 问题 (the proba...

    SIGAI学习与实践平台
  • vSLAM技术综述

    SLAM是“Simultaneous Localization And Mapping”的缩写,可译为同步定位与建图。概率 SLAM 问题 (the proba...

    小白学视觉
  • 特征工程(七):图像特征提取和深度学习

    有趣的是,机器学习的情况是相反的。我们已经在文本分析应用方面取得了比图像或音频更多的进展。以搜索问题为例。人们在信息检索和文本检索方面已经取得了相当多年的成功,...

    机器学习AI算法工程
  • 图像特征提取(颜色,纹理,形状)

    计算机视觉的特征提取算法研究至关重要。在一些算法中,一个高复杂度特征的提取可能能够解决问题(进行目标检测等目的),但这将以处理更多数据,需要更高的处理效果...

    小白学视觉
  • Good Feature Matching: Towards Accurate, Robust VO/VSLAM with Low Latency 良好的特征匹配:实现准确、鲁棒的低延迟VO/VSLA

    —在VO或VSLAM系统中保持性能(精确度和鲁棒性)和效率(延迟)的取舍是一个重要的课题。基于特征的系统展现了良好的性能,但由于显式的数据关联有更高的时延;直接...

    用户1150922
  • 原来CNN是这样提取图像特征的。。。

    深度学习对外推荐自己的一个很重要的点——深度学习能够自动提取特征。本文主要介绍卷积层提取特征的原理过程,文章通过几个简单的例子,展示卷积层是如何工作的,以及...

    用户1150922
  • 原来CNN是这样提取图像特征的

    假设有一个5*5的图像,使用一个3*3的卷积核(filter)进行卷积,得到一个3*3的矩阵(其实是Feature Map,后面会讲),如下所示:

    小白学视觉
  • 通俗理解SLAM算法

    SLAM (simultaneous localization and mapping),也称为CML (Concurrent Mapping and Loca...

    智能算法
  • VSLAM前端:双目极线搜索匹配

     3. 对于空间中同一个点,被相邻两帧拍到,亮度值变化很小。但由于位姿是假设的一个值,所以重投影的点不准确,导致投影前后的亮度值是不相等的,不断进行迭代优化。

    猫叔Rex
  • OpenCV特征提取与图像检索实现(附代码)

    翻译 | AI科技大本营 参与 | 张蔚敏 审校 | reason_W “拍立淘”“一键识花”“街景匹配”……不知道大家在使用这些神奇的功能的时候,有没有好奇过...

    AI科技大本营

扫码关注云+社区

领取腾讯云代金券