ORB-SLAM3 特征点 📅 2026/7/7 4:21:25 int N;、std::vectorcv::KeyPoint mvKeys, mvKeysRight;和std::vectorcv::KeyPoint mvKeysUn;是 ORB-SLAM3 中Frame类的核心成员变量用于存储图像中提取的特征点信息。 变量定义这些变量在 ORB-SLAM3 的Frame.h文件中定义cppclass Frame { public: int N; // 特征点数量 std::vectorcv::KeyPoint mvKeys; // 原始提取的特征点含畸变 std::vectorcv::KeyPoint mvKeysRight; // 右目原始特征点仅双目/RGB-D使用 std::vectorcv::KeyPoint mvKeysUn; // 去畸变后的特征点用于计算 // ... }; 详细解读1.int N含义当前帧中提取的特征点总数。作用作为所有特征点相关向量的大小基准用于遍历和索引。赋值通常在构造函数中根据图像提取的特征点数量赋值cppN mvKeys.size(); // 单目 N mvKeys.size(); // 双目/深度一般取左目数量2.std::vectorcv::KeyPoint mvKeys含义从原始图像中提取的ORB特征点包含相机畸变。来源直接从图像上通过ORBextractor提取得到坐标是原始的像素坐标 (u, v)未经任何修正。用途主要用于特征匹配和描述子提取。3.std::vectorcv::KeyPoint mvKeysRight含义右目图像中提取的ORB特征点仅用于双目相机和RGB-D相机。用途用于双目立体匹配计算视差和深度。在单目相机中此向量为空。4.std::vectorcv::KeyPoint mvKeysUn含义去畸变后的特征点Undistorted Keypoints即矫正后的归一化平面坐标或像素坐标。计算方式在Frame构造函数中通过调用相机模型的UndistortKeyPoints()函数将mvKeys中的畸变坐标矫正为无畸变坐标。cppmpCamera-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中N和mvKeysUn在单目和双目模式下的主要区别如下 核心区别速览特性单目模式双目模式N(特征点数量)等于左目图像提取的特征点总数。同样等于左目图像的特征点总数。mvKeysUn(去畸变特征点)始终有效存储所有去畸变后的特征点用于几何计算。通常无意义因为输入图像一般已预先矫正该字段可能为空或未被使用。数据来源仅有一张图像。左右两张图像但主流程基于左目。特征点存储mvKeys(原始) -mvKeysUn(去畸变)。mvKeys(左目原始)mvKeysRight(右目原始)。mvKeysUn的作用提供无畸变的坐标用于后续三角化、重投影误差计算等。因输入图像已去畸变其作用被弱化或替代。 详细解读N(特征点数量)无论是单目还是双目N都代表左目图像提取的特征点数量。在双目模式下右目图像的特征点存储在另一个向量mvKeysRight中不计算在N内。mvKeysUn(去畸变后的特征点)这是两者最核心的区别。在单目模式中mvKeysUn非常重要。它存储了mvKeys经过去畸变后的特征点是后续所有几何计算如三角化、计算重投影误差等的基础。在双目模式中mvKeysUn的“存在感”很低因为双目系统通常处理的是已经过极线矫正Rectified的图像对。这意味着输入的图像本身就已去畸变因此mvKeysUn可能未被使用或直接复制了mvKeys的值。简单来说N的含义在两种模式下是一致的都指代左目图像的特征点数量。而mvKeysUn则是单目模式下不可或缺的“几何计算基准”在双目模式下这个角色通常由已经矫正好的原始图像承担了。