ORB-SLAM3学习笔记

1.ORB-SLAM3介绍

ORB-SLAM3 是一个先进的开源视觉同步定位与地图构建(SLAM)系统,能够处理单目、双目和RGB-D相机的视觉、视觉惯性和多地图SLAM。ORB-SLAM3 是第一个可以同时进行视觉、视觉惯性和多地图SLAM的系统。它的独特之处在于其特征驱动的紧密集成的视觉惯性SLAM系统,完全依赖于最大后验估计(MAP),即使在IMU初始化阶段也能实现。该系统能够在小型和大型、室内和室外环境中实时运行,其准确性比之前的方法高出2到10倍​

2.特征提取功能

2.1特征提取介绍
ORB-SLAM3的特征提取主要依赖于ORB(Oriented FAST and Rotated BRIEF)特征。ORB特征是一种高效且具有旋转不变性的二进制描述符,它结合了FAST特征检测器和BRIEF描述符。ORB特征提取器能够在图像中检测和描述特征点,这些特征点在后续的特征匹配、地图构建和位姿估计中起到关键作用。

2.2工作流程
2.2.1 特征检测
首先,ORB-SLAM3在输入图像中使用FAST算法检测特征点。FAST(Features from Accelerated Segment Test)算法是一种基于角点的特征检测方法,它通过比较像素点及其周围邻域的亮度差异来快速检测角点。具体而言,对于一个像素点P,FAST算法检查其周围的16个像素,如果这些像素中有一组连续的像素,其亮度值要么显著高于P,要么显著低于P,则P被认为是一个角点。通过这种方法,FAST算法可以在保证检测速度的前提下,准确地定位特征点。
2.2.2特征描述
检测到特征点后,ORB-SLAM3使用BRIEF(Binary Robust Independent Elementary Features)描述符来描述这些特征点的局部图像块。BRIEF描述符是一种高效的二进制描述符,通过对图像块内的像素对进行简单的亮度比较生成二进制字符串。具体来说,BRIEF描述符选择一对像素(x,y),如果x的亮度大于y,则该对像素的描述符值为1,否则为0。通过对多个像素对进行类似的比较,生成一个包含n位二进制值的描述符。这个描述符不仅计算速度快,而且具有很强的区分能力,能够有效地描述图像中的特征点。
2.2.3特征匹配
在后续的帧之间,通过汉明距离(Hamming Distance)来匹配特征点。汉明距离是一种度量两个二进制字符串之间不同位数量的方法。在ORB-SLAM3中,每个特征点都有一个相应的BRIEF描述符,通过计算两个特征点描述符之间的汉明距离,可以判断它们是否匹配。具体来说,描述符之间的汉明距离越小,表示这两个特征点越相似,匹配的可能性越大。通过这种方式,ORB-SLAM3能够在连续帧之间建立特征点的对应关系,为后续的位姿估计和地图构建提供基础。
2.2.4位资估计
通过匹配的特征点,ORB-SLAM3使用PnP(Perspective-n-Point)算法估计相机的位姿。PnP算法是一种常用的计算机视觉算法,用于确定相机在三维空间中的位置和方向。具体来说,PnP算法利用匹配的三维点和相应的二维图像点,求解相机的外部参数(位姿),即相机的位置和平移向量。通过最小化投影误差,PnP算法能够精确地计算出相机的位姿,为ORB-SLAM3系统提供准确的位置信息。
2.2.5地图构建和优化
将特征点和相机位姿集成到地图中,通过局部和全局优化(如Bundle Adjustment)提高地图和轨迹的准确性。在ORB-SLAM3中,地图构建是一个持续的过程,随着新的帧被处理,不断更新和优化已有的地图。局部优化通过对相邻帧之间的特征点和位姿进行调整,减少局部误差。而全局优化则通过对整个地图中的所有特征点和相机位姿进行联合优化,消除累积误差,确保地图的全局一致性。通过这些优化步骤,ORB-SLAM3能够生成高精度的三维地图和准确的相机轨迹。

3.源码分析

ORB-SLAM3的源码结构复杂且模块化。在特征提取方面,主要涉及以下几个文件和函数:
3.1 ORBextractor.cc和ORBextractor.h
这些文件实现了ORB特征的检测和描述功能。ORBextractor类是ORB-SLAM3中负责特征提取的核心组件。它的主要任务是从输入图像中检测特征点并计算其描述符。ORBextractor类的核心方法是operator(),该方法接收一幅图像作为输入,并返回检测到的特征点和描述符。具体实现过程中,首先将输入图像转换为适当的格式,然后通过ComputePyramid方法构建图像金字塔,以便在不同尺度上检测特征点。接着,使用ComputeKeyPointsOctTree方法在图像金字塔的每一层中检测特征点,并将这些特征点转换为描述符,最后返回特征点和描述符。

void ORBextractor::operator()(cv::InputArray _image, std::vector<cv::KeyPoint>& _keypoints, cv::OutputArray _descriptors)
{
    // 转换输入图像
    cv::Mat image = _image.getMat();

    // 初始化关键点和描述符
    _keypoints.clear();

    // 多层次检测
    ComputePyramid(image);

    // 提取ORB特征
    std::vector<std::vector<cv::KeyPoint> > allKeypoints;
    ComputeKeyPointsOctTree(allKeypoints);

    // 转换结果
    cv::Mat descriptors;
    ComputeDescriptors(allKeypoints, descriptors);

    // 赋值结果
    _descriptors.create(descriptors.size(), descriptors.type());
    descriptors.copyTo(_descriptors);
}

3.2 ORBmatcher.cc和ORBmatcher.h
这些文件实现了特征点的匹配功能。ORBmatcher类负责在不同帧之间匹配特征点。其核心方法是SearchByBoW,该方法利用词袋模型(BoW)进行特征匹配。具体来说,首先获取关键帧和当前帧中的所有特征点和描述符,然后通过词袋模型计算每个特征点的匹配候选集。接着,通过DescriptorDistance方法计算特征点描述符之间的汉明距离,找到最佳匹配对。最后,将匹配的特征点对返回,用于后续的位姿估计和地图构建。

int ORBmatcher::SearchByBoW(Frame &F, KeyFrame *pKF, vector<MapPoint*> &vpMapPointMatches)
{
    // 获取特征点
    const vector<MapPoint*> vpMapPointsKF = pKF->GetMapPointMatches();
    const vector<MapPoint*> vpMapPointsF = F.GetMapPointMatches();

    // 特征点匹配
    int nmatches = 0;
    for(size_t i=0; i<vpMapPointsKF.size(); i++)
    {
        MapPoint* pMP = vpMapPointsKF[i];
        if(pMP)
        {
            int idxKF = pMP->GetIndexInKeyFrame(pKF);
            const cv::Mat &dKF = pKF->mDescriptors.row(idxKF);
            int bestDist1=256;
            int bestIdxF = -1;

            for(size_t j=0; j<vpMapPointsF.size(); j++)
            {
                MapPoint* pMPF = vpMapPointsF[j];
                if(pMPF)
                {
                    const int &idxF = pMPF->GetIndexInFrame(F);
                    const cv::Mat &dF = F.mDescriptors.row(idxF);
                    const int dist = DescriptorDistance(dKF,dF);

                    if(dist<bestDist1)
                    {
                        bestDist1=dist;
                        bestIdxF=idxF;
                    }
                }
            }

            if(bestDist1<=TH_HIGH)
            {
                vpMapPointMatches[bestIdxF]=pMP;
                nmatches++;
            }
        }
    }
    return nmatches;
}

这些源码文件展示了ORB-SLAM3如何通过ORB特征进行特征提取和匹配。ORB特征的高效性和稳定性使其在实时SLAM系统中得到了广泛应用。

4.特征提取实验结果

本文使用了EuRoC MAV数据集和TUM VI数据集进行实验。在EuRoC MAV数据集中,ORB-SLAM3在快速手持运动和各种光照条件下都表现出色,平均定位误差为3.5厘米。在TUM VI数据集中,即使在AR/VR场景中快速移动,ORB-SLAM3也能达到9毫米的定位精度。

5.总结

ORB-SLAM3作为最新的视觉SLAM系统,在特征提取、特征匹配和位姿估计等方面表现出色。其多地图系统和改进的回环检测算法显著提高了系统的鲁棒性和准确性。对于研究人员和工程师来说,ORB-SLAM3不仅是一个强大的工具,也是未来视觉SLAM系统发展的基石。通过深入理解其特征提取和匹配过程,可以更好地利用这一先进的SLAM系统进行各种应用。

posted on   孟夏111  阅读(168)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示