【ORB_SLAM2源码解读】构建图像金字塔(5)

原理讲解

/**
 * 0. 微信 slamshizhanjiaocheng QQ群 925533821
 * 1. 加载 Euroc 数据集 
 * 2. 加载 Euroc 数据集参数 对图像进行去畸变 
 * 3. 创建 ORB_SLAM2::System 对象, 初始化 System Tracking Frame ORBextractor 
 * 4. 执行 ORBextractor 构造函数 a.金字塔每层图像缩放系数 b.金字塔每层图像提取特征点数量 c.计算umax 
 * 5. 执行 System::TrackStereo Tracking::GrabImageStereo Frame::Frame Frame::ExtractORB ORBextractor::operator() 函数 计算图像金子塔 
 */
void ORBextractor::ComputePyramid(cv::Mat image)
{
    for (int level = 0; level < nlevels; ++level)// 遍历图像金字塔 0 1 2 3 4 5 6 7
    {
        float scale = mvInvScaleFactor[level];// 图像缩放系数 1 0.83
        Size sz(cvRound((float)image.cols*scale), cvRound((float)image.rows*scale));// 缩放后图像的宽高
        Size wholeSize(sz.width + EDGE_THRESHOLD*2, sz.height + EDGE_THRESHOLD*2);// 对缩放后图像的加上边框后图像宽高
        Mat temp(wholeSize, image.type()), masktemp;// 创建两个 CV::Mat
        mvImagePyramid[level] = temp(Rect(EDGE_THRESHOLD, EDGE_THRESHOLD, sz.width, sz.height));// 给图像金字塔赋值,注意这里只是图像的宽高和像素的类型,还没有为每个像素赋值
        // Compute the resized image
        if( level != 0 )
        {
            resize(mvImagePyramid[level-1], mvImagePyramid[level], sz, 0, 0, INTER_LINEAR);
            copyMakeBorder(mvImagePyramid[level], temp, EDGE_THRESHOLD, EDGE_THRESHOLD, EDGE_THRESHOLD, EDGE_THRESHOLD, BORDER_REFLECT_101+BORDER_ISOLATED);
            // cv::imwrite("mvImagePyramid_" + to_string(level) + ".png", mvImagePyramid[level]);
            // cv::imwrite("temp_" + to_string(level) + ".png", temp);
        }
        else
        {
            // 原始图像不需要缩放, 直接进行边界19个像素的对称扩充理解为加边框, 这里生成了第一张金字塔图像
            copyMakeBorder(image, temp, EDGE_THRESHOLD, EDGE_THRESHOLD, EDGE_THRESHOLD, EDGE_THRESHOLD,BORDER_REFLECT_101);
            // cv::imwrite("image.png", image);
            // cv::imwrite("temp.png", temp);
            // cv::imwrite("mvImagePyramid_" + to_string(level) + ".png", mvImagePyramid[level]);
        }
    }

}

边缘扩充后的图像

【ORB_SLAM2源码解读】构建图像金字塔(5)_第1张图片

图像金字塔

【ORB_SLAM2源码解读】构建图像金字塔(5)_第2张图片

视频讲解

逐个函数功能详细讲解ORB_SLAM2源码|图像金字塔

你可能感兴趣的:(从零开始学习SLAM,ORB_SLAM2,ORB_SLAM3)