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中,N和mvKeysUn在单目和双目模式下的主要区别如下:
📊 核心区别速览
| 特性 | 单目模式 | 双目模式 |
|---|---|---|
N(特征点数量) | 等于左目图像提取的特征点总数。 | 同样等于左目图像的特征点总数。 |
mvKeysUn(去畸变特征点) | 始终有效,存储所有去畸变后的特征点,用于几何计算。 | 通常无意义,因为输入图像一般已预先矫正,该字段可能为空或未被使用。 |
| 数据来源 | 仅有一张图像。 | 左右两张图像,但主流程基于左目。 |
| 特征点存储 | mvKeys(原始) ->mvKeysUn(去畸变)。 | mvKeys(左目原始),mvKeysRight(右目原始)。 |
mvKeysUn的作用 | 提供无畸变的坐标,用于后续三角化、重投影误差计算等。 | 因输入图像已去畸变,其作用被弱化或替代。 |
📝 详细解读
N(特征点数量):无论是单目还是双目,N都代表左目图像提取的特征点数量。在双目模式下,右目图像的特征点存储在另一个向量mvKeysRight中,不计算在N内。mvKeysUn(去畸变后的特征点):这是两者最核心的区别。在单目模式中:
mvKeysUn非常重要。它存储了mvKeys经过去畸变后的特征点,是后续所有几何计算(如三角化、计算重投影误差等)的基础。在双目模式中:
mvKeysUn的“存在感”很低,因为双目系统通常处理的是已经过极线矫正(Rectified)的图像对。这意味着输入的图像本身就已去畸变,因此mvKeysUn可能未被使用或直接复制了mvKeys的值。
简单来说,N的含义在两种模式下是一致的,都指代左目图像的特征点数量。而mvKeysUn则是单目模式下不可或缺的“几何计算基准”,在双目模式下,这个角色通常由已经矫正好的原始图像承担了。