ORB-SLAM3的源码学习: Settings.cc:Settings::readImageInfo读取图像信息

前言

简单总结一下:这个函数的主要目的是从配置文件中读取和设置与相机图像尺寸相关的各种参数。它会根据需要调整图像的宽度和高度,并根据这些调整更新相机的校准参数。如果是立体相机或带IMU的相机,还会同时更新第二个相机的校准参数。最终,这些调整确保图像和相机校准信息的一致性。

1.函数声明

void Settings::readImageInfo(cv::FileStorage &fSettings)

2.函数定义 

1.读取原始图像的尺寸以及新图像尺寸

首先读取原始图像的信息,在将信息赋值给一个用于表示新图像的变量,以便用于后续处理用。 

// Read original and desired image dimensions
    int originalRows = readParameter(fSettings, "Camera.height", found);
    int originalCols = readParameter(fSettings, "Camera.width", found);
    originalImSize_.width = originalCols;
    originalImSize_.height = originalRows;

2.读取图像的新高度信息 

newImSize_ = originalImSize_;
    int newHeigh = readParameter(fSettings, "Camera.newHeight", found, false);

如果需要调整图像高度,更新图像尺寸及相关校准参数

新高度比上老高度作为缩放因子scaleRowFactor,调整y轴方向上的两个参数。 

if (found)
    {
        bNeedToResize1_ = true;
        newImSize_.height = newHeigh;

        if (!bNeedToRectify_)
        {
            // Update calibration
            float scaleRowFactor = (float)newImSize_.height / (float)originalImSize_.height;
            calibration1_->setParameter(calibration1_->getParameter(1) * scaleRowFactor, 1);
            calibration1_->setParameter(calibration1_->getParameter(3) * scaleRowFactor, 3);

            if ((sensor_ == System::STEREO || sensor_ == System::IMU_STEREO) && cameraType_ != Rectified)
            {
                calibration2_->setParameter(calibration2_->getParameter(1) * scaleRowFactor, 1);
                calibration2_->setParameter(calibration2_->getParameter(3) * scaleRowFactor, 3);
            }
        }
    }

3. 读取图像的新宽度信息

 int newWidth = readParameter(fSettings, "Camera.newWidth", found, false);

如果需要调整图像宽度,更新图像尺寸及相关校准参数

新宽度比上老宽度作为缩放因子scaleRowFactor,调整x轴方向上的两个参数。

 if (found)
    {
        bNeedToResize1_ = true;
        newImSize_.width = newWidth;

        if (!bNeedToRectify_)
        {
            // Update calibration
            float scaleColFactor = (float)newImSize_.width / (float)originalImSize_.width;
            calibration1_->setParameter(calibration1_->getParameter(0) * scaleColFactor, 0);
            calibration1_->setParameter(calibration1_->getParameter(2) * scaleColFactor, 2);

            if ((sensor_ == System::STEREO || sensor_ == System::IMU_STEREO) && cameraType_ != Rectified)
            {
                calibration2_->setParameter(calibration2_->getParameter(0) * scaleColFactor, 0);
                calibration2_->setParameter(calibration2_->getParameter(2) * scaleColFactor, 2);

                if (cameraType_ == KannalaBrandt)
                {
                    static_cast(calibration1_)->mvLappingArea[0] *= scaleColFactor;
                    static_cast(calibration1_)->mvLappingArea[1] *= scaleColFactor;

                    static_cast(calibration2_)->mvLappingArea[0] *= scaleColFactor;
                    static_cast(calibration2_)->mvLappingArea[1] *= scaleColFactor;
                }
            }
        }
    }

4.读取相机的帧率和是否为RGB图像

fps_ = readParameter(fSettings, "Camera.fps", found);
bRGB_ = (bool)readParameter(fSettings, "Camera.RGB", found);

完整的代码 

void Settings::readImageInfo(cv::FileStorage &fSettings)
{
    bool found;
    // Read original and desired image dimensions
    int originalRows = readParameter(fSettings, "Camera.height", found);
    int originalCols = readParameter(fSettings, "Camera.width", found);
    originalImSize_.width = originalCols;
    originalImSize_.height = originalRows;

    newImSize_ = originalImSize_;
    int newHeigh = readParameter(fSettings, "Camera.newHeight", found, false);
    if (found)
    {
        bNeedToResize1_ = true;
        newImSize_.height = newHeigh;

        if (!bNeedToRectify_)
        {
            // Update calibration
            float scaleRowFactor = (float)newImSize_.height / (float)originalImSize_.height;
            calibration1_->setParameter(calibration1_->getParameter(1) * scaleRowFactor, 1);
            calibration1_->setParameter(calibration1_->getParameter(3) * scaleRowFactor, 3);

            if ((sensor_ == System::STEREO || sensor_ == System::IMU_STEREO) && cameraType_ != Rectified)
            {
                calibration2_->setParameter(calibration2_->getParameter(1) * scaleRowFactor, 1);
                calibration2_->setParameter(calibration2_->getParameter(3) * scaleRowFactor, 3);
            }
        }
    }

    int newWidth = readParameter(fSettings, "Camera.newWidth", found, false);
    if (found)
    {
        bNeedToResize1_ = true;
        newImSize_.width = newWidth;

        if (!bNeedToRectify_)
        {
            // Update calibration
            float scaleColFactor = (float)newImSize_.width / (float)originalImSize_.width;
            calibration1_->setParameter(calibration1_->getParameter(0) * scaleColFactor, 0);
            calibration1_->setParameter(calibration1_->getParameter(2) * scaleColFactor, 2);

            if ((sensor_ == System::STEREO || sensor_ == System::IMU_STEREO) && cameraType_ != Rectified)
            {
                calibration2_->setParameter(calibration2_->getParameter(0) * scaleColFactor, 0);
                calibration2_->setParameter(calibration2_->getParameter(2) * scaleColFactor, 2);

                if (cameraType_ == KannalaBrandt)
                {
                    static_cast(calibration1_)->mvLappingArea[0] *= scaleColFactor;
                    static_cast(calibration1_)->mvLappingArea[1] *= scaleColFactor;

                    static_cast(calibration2_)->mvLappingArea[0] *= scaleColFactor;
                    static_cast(calibration2_)->mvLappingArea[1] *= scaleColFactor;
                }
            }
        }
    }

    fps_ = readParameter(fSettings, "Camera.fps", found);
    bRGB_ = (bool)readParameter(fSettings, "Camera.RGB", found);
}

结束语

以上就是我学习到的内容,如果对您有帮助请多多支持我,如果哪里有问题欢迎大家在评论区积极讨论,我看到会及时回复。

你可能感兴趣的:(计算机视觉,#,ORB-SLAM3,计算机视觉,opencv,ubuntu,c++,人工智能,学习)