ORB-SLAM3 特征点

📅 2026/7/7 4:36:01 👁️ 阅读次数 📝 编程学习
ORB-SLAM3 特征点

int N;std::vector<cv::KeyPoint> mvKeys, mvKeysRight;std::vector<cv::KeyPoint> mvKeysUn;是 ORB-SLAM3 中Frame类的核心成员变量,用于存储图像中提取的特征点信息。


📝 变量定义

这些变量在 ORB-SLAM3 的Frame.h文件中定义:

cpp

class Frame { public: int N; // 特征点数量 std::vector<cv::KeyPoint> mvKeys; // 原始提取的特征点(含畸变) std::vector<cv::KeyPoint> mvKeysRight; // 右目原始特征点(仅双目/RGB-D使用) std::vector<cv::KeyPoint> mvKeysUn; // 去畸变后的特征点(用于计算) // ... };

📖 详细解读

1.int N

  • 含义:当前帧中提取的特征点总数

  • 作用:作为所有特征点相关向量的大小基准,用于遍历和索引。

  • 赋值:通常在构造函数中根据图像提取的特征点数量赋值:

    cpp

    N = mvKeys.size(); // 单目 N = mvKeys.size(); // 双目/深度,一般取左目数量

2.std::vector<cv::KeyPoint> mvKeys

  • 含义:从原始图像中提取的ORB特征点(包含相机畸变)。

  • 来源:直接从图像上通过ORBextractor提取得到,坐标是原始的像素坐标 (u, v),未经任何修正。

  • 用途:主要用于特征匹配描述子提取

3.std::vector<cv::KeyPoint> mvKeysRight

  • 含义右目图像中提取的ORB特征点(仅用于双目相机RGB-D相机)。

  • 用途:用于双目立体匹配,计算视差和深度。在单目相机中,此向量为空。

4.std::vector<cv::KeyPoint> mvKeysUn

  • 含义去畸变后的特征点(Undistorted Keypoints),即矫正后的归一化平面坐标或像素坐标

  • 计算方式:在Frame构造函数中,通过调用相机模型的UndistortKeyPoints()函数,将mvKeys中的畸变坐标矫正为无畸变坐标。

    cpp

    mpCamera->UndistortKeyPoints(mvKeys, mvKeysUn);
  • 用途:用于所有需要精确几何计算的任务,包括:

    • 三角化生成地图点

    • 计算重投影误差

    • 位姿优化(BA)

    • 与地图点进行3D-2D匹配


🔍 三种特征点的对比

变量是否含畸变坐标系主要用途
mvKeys✅ 是原始像素坐标 (u, v)特征提取、描述子匹配
mvKeysRight✅ 是(右目)原始像素坐标 (u, v)双目立体匹配
mvKeysUn❌ 否(已矫正)矫正后像素坐标或归一化平面坐标三角化、BA优化、重投影误差计算

⚙️ 实际使用示例

获取特征点坐标

cpp

// 使用原始坐标(匹配时常用) cv::KeyPoint kp = mvKeys[i]; float u = kp.pt.x; float v = kp.pt.y; // 使用去畸变坐标(几何计算时常用) cv::KeyPoint kp_un = mvKeysUn[i]; float u_un = kp_un.pt.x; float v_un = kp_un.pt.y;

双目深度计算

cpp

// 在双目模式下,左右目特征点匹配 // mvKeys 为左目特征点,mvKeysRight 为右目特征点 float disparity = mvKeys[i].pt.x - mvKeysRight[i].pt.x; float depth = f * baseline / disparity; // 计算深度

💎 总结

变量一句话总结
N特征点总数,向量大小的基准
mvKeys原始提取的、含畸变的特征点,用于匹配
mvKeysRight右目原始特征点,仅双目/RGB-D使用
mvKeysUn去畸变后的特征点,用于所有几何计算

补充:

在ORB-SLAM3中,NmvKeysUn在单目和双目模式下的主要区别如下:

📊 核心区别速览

特性单目模式双目模式
N(特征点数量)等于左目图像提取的特征点总数。同样等于左目图像的特征点总数。
mvKeysUn(去畸变特征点)始终有效,存储所有去畸变后的特征点,用于几何计算。通常无意义,因为输入图像一般已预先矫正,该字段可能为空或未被使用。
数据来源仅有一张图像。左右两张图像,但主流程基于左目。
特征点存储mvKeys(原始) ->mvKeysUn(去畸变)。mvKeys(左目原始),mvKeysRight(右目原始)。
mvKeysUn的作用提供无畸变的坐标,用于后续三角化、重投影误差计算等。因输入图像已去畸变,其作用被弱化或替代。

📝 详细解读

  • N(特征点数量):无论是单目还是双目,N都代表左目图像提取的特征点数量。在双目模式下,右目图像的特征点存储在另一个向量mvKeysRight中,不计算在N内。

  • mvKeysUn(去畸变后的特征点):这是两者最核心的区别

    • 在单目模式中mvKeysUn非常重要。它存储了mvKeys经过去畸变后的特征点,是后续所有几何计算(如三角化、计算重投影误差等)的基础。

    • 在双目模式中mvKeysUn的“存在感”很低,因为双目系统通常处理的是已经过极线矫正(Rectified)的图像对。这意味着输入的图像本身就已去畸变,因此mvKeysUn可能未被使用或直接复制了mvKeys的值。

简单来说,N的含义在两种模式下是一致的,都指代左目图像的特征点数量。而mvKeysUn则是单目模式下不可或缺的“几何计算基准”,在双目模式下,这个角色通常由已经矫正好的原始图像承担了。