ORB-SLAM初始化:Initializer.cpp

ORB-SLAM初始化:Initializer.cpp_第1张图片
附:
1.在思维导图中出现的FindHomography与FindFundamental里的第一步都是对KeyPoint点进行归一化,推测的好处是:减少数据因为尺度变化过大异常值等的原因影响结果。关于归一化的内容如下:

ORB-SLAM初始化:Initializer.cpp_第2张图片
2.关于协方差矩阵的一点认识:
协方差矩阵可以简单粗暴的说成是分配权重的。权重矩阵称为为信息矩阵,它是协方差矩阵的逆,因为每个残差都看作高斯分布,而每个高斯分布都可以归一化为标准的高斯分布N(0,1),这种归一化操作是减去均值求平方然后除以方差。残差预期均值为0,所以不用减只需要除以方差,扩展到多维的话就变成了信息矩阵加权形式。
就是说计算出协方差矩阵,然后除以协方差矩阵。对于VIO来说:IMU和视觉融合的过程其实就是对IMU的预计分残差以及视觉信息的重投影误差进行量纲的过程,这样两个归一化之后才可以直接线性相加。而在ORB这种视觉系统来说:

        // x2in1 = H12*x2
        // 将图像2中的特征点单应到图像1中
        // |u1|   |h11inv h12inv h13inv||u2|
        // |v1| = |h21inv h22inv h23inv||v2|
        // |1 |   |h31inv h32inv h33inv||1 |
        const float w2in1inv = 1.0/(h31inv*u2+h32inv*v2+h33inv);
        const float u2in1 = (h11inv*u2+h12inv*v2+h13inv)*w2in1inv;
        const float v2in1 = (h21inv*u2+h22inv*v2+h23inv)*w2in1inv;

        // 计算重投影误差
        const float squareDist1 = (u1-u2in1)*(u1-u2in1)+(v1-v2in1)*(v1-v2in1);

        // 根据方差归一化误差
        const float chiSquare1 = squareDist1*invSigmaSquare;

会发现他最后页用方差进行了归一化,在ORB中方差又是如何取的呢:协方差一般根据特征点提取的金字塔层级(初始化就为0层)确定。具体的,记提取ORB特征时,图像金字塔的每层缩小尺度为 s (ORB-SLAM中为1.2)。在ORB-SLAM中假设第0层的标准差为p 个pixel (ORB-SLAM中设为了1个pixel);那么,一个在金字塔第 n 层提取的特征的重投影误差的协方差为
Alt
不同金字塔层提取的特征,计算的重投影误差都被归一化了,或者说去量纲化了,白化了 .那么,我们只用一个阈值就可以了。

你可能感兴趣的:(ORB-SLAM初始化:Initializer.cpp)