c++ opencv图像中选择点显示点的坐标_ORBSLAM2中的ORB特征点理论与实践

我们知道,一个SLAM系统分为前端和后端,其中前端也叫视觉里程计(VO),视觉里程计的作用是根据相邻图像的信息估计出一个粗略的相机运动,作为初值提供给后端。而视觉里程计的算法分为两大类:特征点法和直接法。本期我们介绍特征点法,它具有稳定,对光照、动态物体不敏感的有事,目前已经相当成熟。

SIFT/SURF/ORB特征点等人工设计的特征点,他们多多少少都具有如下性质:

1.可重复性----相同的特征可以在不同的图像上找到

2.可区别性----不同的特征具有不同的表达

3.高效率性----同一图像中,特征点的数量远小于像素点数量

4.本地性----特征仅与其邻域相关

首先,特征点是由关键点和描述子两部分组成,关键点一般指的是该特征点在图像上面的位置,有的特征点还具有朝向、大小等信息,描述子描述了其邻域像素的信息。SLAM中很少用SIFT这样奢侈的特征点因为SIFT特征在普通电脑CPU上无法实时计算。相反,FAST关键点计算相当快,但是它只是关键点,没有描述子。ORB-----Oriented FAST and Rotated BRIEF,是目前非常具有代表性的实时图像特征。它改进了FAST检测子不具有方向的问题,并且使用速度极快的二进制描述子BRIEF描述其邻域像素,对于SLAM来说是一个很好的选择。

ORB特征

ORB特征提取步骤:图像金字塔各层FAST角点提取+角点主方向计算+BRIEF描述子提取

A.FAST关键点 

9f936952614c8c50a23dac43cd75097e.png

1.在图像中选择像素p,假设它的亮度为L

2.设置一个阈值T(比如L的20%)

3.以p为中心,选取半径为3的圆上16个像素点

4.假设选取的圆上有连续的N个点的亮度大于L+T或小于L-T,那么像素p可以被认为是特征点(N一般取12,即FAST-12.另外也有FAST-9和FAST-11)

5.使用1-4步骤遍历图像每个像素

小trick:在FAST-12中,为了更快,可以先做一个预筛选,这样可以排除大多数非角点的像素。具体操作为,对于每个像素,直接检测其邻域圆上第1,5,9,13个像素亮度。当且仅当这四个有3个像素亮度同时大于L+T或小于L-T,那么才将该像素加入候选队列进行再次筛选。此外原始的FAST角点经常出现扎堆现象,所以检测之后还需要进行非极大值抑制,在一定区域内仅保留响应极大值的情况,这在一定程度上克服了角点扎堆~

FAST特征点的计算仅仅比较像素间亮度的差异,所以速度极快,但是他存在重复性不强、分布不够均匀等缺点。此外,FAST不具有方向信息。同时,由于它固定取半径为3的圆,存在尺度问题:远处看是角点,近处看不是角点。

针对方向性问题---采用灰度质心法

计算特征点附近的图像灰度质心

1.在一个小的图像块B中,定义图像块的矩为:

63ff1494eed5870fa420230d102b862d.png

2.通过矩找到图像块的质心:

cce54b4d6bc9c516ea8bb2495c5a4ad6.png

3.连接图像块的几何中心O和质心C,得到一个方向向量,于是特征点的方向可以定义为

e0e5d8392d66eefc31225027e4c6af0c.png

针对尺度问题---采用图像金字塔 

364c3a57228d7032329c37b3f926550a.png

金字塔底层是原始图像,每网上一层,就对图像进行了一个固定倍率的缩放,就相当于我们有了分辨率不同的图像。较小的图像可以看成是远处看过来的场景。在特征匹配算法中,我们可以匹配不同层上的图像,从而实现尺度不变性。

B.BRIEF描述子

2315b867724b2b724c38da8cec18e861.png

BRIEF是一种二进制描述子,由0和1组成,0和1编码了关键点邻域附近两个随机像素的大小关系。ORB在FAST关键点计算时计算了关键点的方向,因此利用方向心肌计算旋转之后的“Steer BRIEF”特征使得

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用ORB SLAM2提取一幅图像特征点需要按照以下步骤进行: 1. 创建一个ORBextractor对象,该对象用于提取特征点和描述符。ORBextractor类是ORB-SLAM2库的一个类,可以通过构造函数指定特征点数量、图像金字塔层数等参数。 2. 读取图像并将其转换为灰度图像ORB-SLAM2只能处理灰度图像。可以使用OpenCV的cv::imread函数读取图像,并使用cv::cvtColor函数将其转换为灰度图像。 3. 调用ORBextractor的operator()函数提取图像特征点和描述符。该函数的输入参数为灰度图像和一个可选的掩码图像。 4. 获取提取的特征点和描述符。特征点是一个std::vector<cv::KeyPoint>对象,每个KeyPoint对象包含特征点坐标、响应值等信息。描述符是一个cv::Mat对象,每行包含一个特征点的描述符,描述符的列数等于ORBextractor构造函数指定的描述符维数,默认为32。 下面是一个示例代码: ``` #include <opencv2/opencv.hpp> #include "ORBextractor.h" int main(int argc, char **argv) { // 创建ORBextractor对象 ORB_SLAM2::ORBextractor orb_extractor(1000, 1.2, 8, 20, 7); // 读取图像并将其转换为灰度图像 cv::Mat image = cv::imread("test.png", cv::IMREAD_GRAYSCALE); // 提取特征点和描述符 std::vector<cv::KeyPoint> keypoints; cv::Mat descriptors; orb_extractor(image, cv::Mat(), keypoints, descriptors); // 输出特征点数量 std::cout << "Number of keypoints: " << keypoints.size() << std::endl; return 0; } ``` 在上面的代码ORBextractor构造函数的参数分别为特征点数量、图像金字塔层数、尺度因子、尺度空间每个层的特征点数量、FAST角检测阈值等。可以根据实际需要调整这些参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值