SLAM14讲第7.1讲--特征点匹配

之前六章我们了解到了旋转矩阵、四元数表示相机位姿;相机坐标系下的坐标转换;李群李代等,均是在相机位姿已知的前提下。但是如何做位姿估计(相机运动估计)呢?单目的双目的深度的是不是一样的呢?这些问题是第7章所围绕的。在这一节,引出最基础的、最前提的概念:特征点匹配。 这个事情也是运动状态估计的前提。
在SIFT算法中,特征点分为两块:关键点和描述子。提取关键点和计算描述子
关键点是指该特征点在图像里的位置,有些特征点还具有朝向、大小等信息。描述子通常是一个向量,按照某种人为设计的方式,描述了该关键点周围像素的信息。

关键点(特征点的提取)

选取什么样的点作为关键点?什么样的点才是有代表性的点?

代表性指出,我们希望特征点在相机运动之后保持稳定,即在同一选取特征点的方式下,他仍然是一个特征点。然而单一像素的点作为特征点显然是不够的,我们需要提取出更具有代表性的“点”来作为我们的特征点。以下是三种经典的选择方式,slam14讲主要讲解的就是角点的选取,这样的选取方法可以获得更具有代表性的特征。
在这里插入图片描述
但角点也有其缺陷,是早已存在于其选择方法中的,我们后文来提及这一点{1}。
具体问题具体分析,slam的作者又给出了三种”更好“的特征选择法:

  1. SIFT D. G. Lowe, “Distinctive image features from scale-invariant keypoints,” International Journal of Computer Vision, vol. 60, no. 2, pp. 91–110, 2004.
  2. SURF D. G. Lowe, “Distinctive image features from scale-invariant keypoints,” International Journal of Computer Vision, vol. 60, no. 2, pp. 91–110, 2004.
  3. ORB ORB: An efficient alternative to SIFT or SURF

我们还是主要来看角点,注意,接下来我们都围绕ORB算法来说

角点(关键点)

在这里插入图片描述
这里注意上图中白色的带编号的框。角点的选取步骤是:

  1. 在图像中选取像素 p,假设它的亮度为 Ip。
  2. 设置一个阈值 T (比如 Ip 的 20%)。
  3. 以像素 p 为中心, 选取半径为 3 的圆上的 16 个像素点。
  4. 假如选取的圆上,有连续的 N 个点的亮度大于 Ip + T 或小于 Ip − T,那么像素 p可以被认为是特征点 (N 通常取 12,即为 FAST-12。其它常用的 N 取值为 9 和 11,他们分别被称为 FAST-9, FAST-11)。
  5. 循环以上四步,对每一个像素执行相同的操作。

当然在这样的选取中依然存在问题,所以选择完后,我们还会做一些优化,比如:非极大值抑制(避免角点扎堆,保留效果最好的点)。就像下图一样
在这里插入图片描述

描述子(ORB 使用改进的BRIEF 特征描述)

有没有印象,我们之前说,在角点的选择方法上就注定了它的缺陷{1}.再次看到7-3图,试想,如果相机靠近了视角中的某个点,由于相机分辨率不变的前提,同一个点随着离相机的距离越近,像素点会不会越多?答案是肯定的。这就意味着:远处看见的角点,走进了,可能这个点就不再是了。这就是不具有尺度不变性
为了克服这个缺点,ORB 添加了尺度和旋转的描述。slam作者书中介绍了构建图像金字塔法灰度质心法来解决这个问题。
图像金字塔: 我们说了相机的移动会导致同一点像素的变化,那么这个原理其实就等同于放大和缩小图片所带来的变化。即对图像进行不同层次的降采样,以获得不同分辨率的图像。这就是图像金字塔方法,利用这一方法,我们可以有效的选取出更有价值的关键点。
灰度质心法: 质心是指以图像块灰度值作为权重所得的中心。具体可参考论文链接,和slam14书中缩略:

  1. 在一个小的图像块 B 中,定义图像块的矩为:
    在这里插入图片描述
  2. 通过矩可以找到图像块的质心:
    在这里插入图片描述
  3. 连接图像块的几何中心 O 与质心 C,得到一个方向向量 OC,于是特征点的方向可以定义为:
    在这里插入图片描述
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ORB-SLAM是一种基于特征点的视觉SLAM算法,它使用ORB特征点来进行特征匹配。ORB特征点是一种既能够快速检测又能够准确描述图像特征的算法。ORB特征点的检测和描述分别使用了FAST角点检测算法和BRIEF描述子算法。ORB-SLAM使用了基于词袋模型的方法来进行特征匹配,具体来说,ORB-SLAM将所有的ORB特征点分成若干个不同的视觉词汇,然后使用BoW(Bag of Words)模型来描述每个图像。在ORB-SLAM中,特征匹配主要分为两个步骤:词袋匹配和光流法匹配。词袋匹配是通过计算两个图像的词袋向量之间的距离来进行的,而光流法匹配则是通过计算两个图像中的特征点在相邻帧之间的运动来进行的。 以下是一个ORB-SLAM特征匹配算法的示例代码: ```c++ // ORB特征点检测和描述 cv::Ptr<cv::ORB> orb = cv::ORB::create(); std::vector<cv::KeyPoint> keypoints1, keypoints2; cv::Mat descriptors1, descriptors2; orb->detectAndCompute(img1, cv::noArray(), keypoints1, descriptors1); orb->detectAndCompute(img2, cv::noArray(), keypoints2, descriptors2); // 词袋匹配 cv::Ptr<cv::DescriptorMatcher> matcher = cv::DescriptorMatcher::create("BruteForce-Hamming"); std::vector<cv::DMatch> matches; matcher->match(descriptors1, descriptors2, matches); // 光流法匹配 std::vector<cv::Point2f> points1, points2; for (auto match : matches) { points1.push_back(keypoints1[match.queryIdx].pt); points2.push_back(keypoints2[match.trainIdx].pt); } std::vector<uchar> status; std::vector<float> err; cv::calcOpticalFlowPyrLK(img1, img2, points1, points2, status, err); // 输出匹配结果 for (int i = 0; i < matches.size(); i++) { if (status[i]) { cv::DMatch match = matches[i]; cv::Point2f pt1 = keypoints1[match.queryIdx].pt; cv::Point2f pt2 = keypoints2[match.trainIdx].pt; std::cout << "Match " << i << ": (" << pt1.x << ", " << pt1.y << ") -> (" << pt2.x << ", " << pt2.y << ")" << std::endl; } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

vigigo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值