设计本网站怎么样,开一个电商公司大概多少钱,服务建设网站,自动写作网站先占坑#xff0c;明天再完善… 文章目录 0 引言1 Frame类1.1 成员函数1.2 成员变量 2 Frame类的用途 0 引言
ORB-SLAM2学习笔记8详细了解了图像特征点提取和描述子的生成#xff0c;本文在此基础上#xff0c;继续学习ORB-SLAM2中的图像帧#xff0c;也就是Frame类#…先占坑明天再完善… 文章目录 0 引言1 Frame类1.1 成员函数1.2 成员变量 2 Frame类的用途 0 引言
ORB-SLAM2学习笔记8详细了解了图像特征点提取和描述子的生成本文在此基础上继续学习ORB-SLAM2中的图像帧也就是Frame类该类中主要包含设置相机参数、利用双目计算深度及特征点反投影到3D地图点等函数。 1 Frame类
构造函数Frame类主要的代码如下 双目相机Frame
// 双目相机Frame构造函数
Frame::Frame(const cv::Mat imLeft, const cv::Mat imRight, const double timeStamp, ORBextractor *extractorLeft, ORBextractor *extractorRight, ORBVocabulary *voc, cv::Mat K, cv::Mat distCoef, const float bf, const float thDepth): mpORBvocabulary(voc), mpORBextractorLeft(extractorLeft), mpORBextractorRight(extractorRight), mTimeStamp(timeStamp), mK(K.clone()), mDistCoef(distCoef.clone()), mbf(bf), mThDepth(thDepth), mpReferenceKF(static_castKeyFrame *(NULL)) {// step0. 帧ID自增mnId nNextId;// step1. 计算金字塔参数mnScaleLevels mpORBextractorLeft-GetLevels();mfScaleFactor mpORBextractorLeft-GetScaleFactor();mfLogScaleFactor log(mfScaleFactor);mvScaleFactors mpORBextractorLeft-GetScaleFactors();mvInvScaleFactors mpORBextractorLeft-GetInverseScaleFactors();mvLevelSigma2 mpORBextractorLeft-GetScaleSigmaSquares();mvInvLevelSigma2 mpORBextractorLeft-GetInverseScaleSigmaSquares();// step2. 提取双目图像特征点thread threadLeft(Frame::ExtractORB, this, 0, imLeft);thread threadRight(Frame::ExtractORB, this, 1, imRight);threadLeft.join();threadRight.join();N mvKeys.size();if (mvKeys.empty())return;// step3. 畸变矫正,实际上UndistortKeyPoints()不对双目图像进行矫正UndistortKeyPoints();// step4. 双目图像特征点匹配ComputeStereoMatches();// step5. 第一次调用构造函数时计算static变量if (mbInitialComputations) {ComputeImageBounds(imLeft);mfGridElementWidthInv static_castfloat(FRAME_GRID_COLS) / static_castfloat(mnMaxX - mnMinX);mfGridElementHeightInv static_castfloat(FRAME_GRID_ROWS) / static_castfloat(mnMaxY - mnMinY);fx K.atfloat(0, 0);fy K.atfloat(1, 1);cx K.atfloat(0, 2);cy K.atfloat(1, 2);invfx 1.0f / fx;invfy 1.0f / fy;// 计算完成,标志复位mbInitialComputations false;}mvpMapPoints vectorMapPoint *(N, static_castMapPoint *(NULL)); // 初始化本帧的地图点mvbOutlier vectorbool(N, false); // 标记当前帧的地图点不是外点mb mbf / fx; // 计算双目基线长度// step6. 将特征点分配到网格中AssignFeaturesToGrid();
}
RGBD相机Frame:
// RGBD相机Frame构造函数
Frame::Frame(const cv::Mat imGray, const cv::Mat imDepth, const double timeStamp, ORBextractor *extractor, ORBVocabulary *voc, cv::Mat K, cv::Mat distCoef, const float bf, const float thDepth): mpORBvocabulary(voc), mpORBextractorLeft(extractor), mpORBextractorRight(static_castORBextractor *(NULL)), mTimeStamp(timeStamp), mK(K.clone()), mDistCoef(distCoef.clone()), mbf(bf), mThDepth(thDepth) {// step0. 帧ID自增mnId nNextId;// step1. 计算金字塔参数mnScaleLevels mpORBextractorLeft-GetLevels();mfScaleFactor mpORBextractorLeft-GetScaleFactor();mfLogScaleFactor log(mfScaleFactor);mvScaleFactors mpORBextractorLeft-GetScaleFactors();mvInvScaleFactors mpORBextractorLeft-GetInverseScaleFactors();mvLevelSigma2 mpORBextractorLeft-GetScaleSigmaSquares();mvInvLevelSigma2 mpORBextractorLeft-GetInverseScaleSigmaSquares();// step2. 提取左目图像特征点ExtractORB(0, imGray);N mvKeys.size();if (mvKeys.empty())return;// step3. 畸变矫正UndistortKeyPoints();// step4. 根据深度信息构造虚拟右目图像ComputeStereoFromRGBD(imDepth);mvpMapPoints vectorMapPoint *(N, static_castMapPoint *(NULL));mvbOutlier vectorbool(N, false);// step5. 第一次调用构造函数时计算static变量if (mbInitialComputations) {ComputeImageBounds(imLeft);mfGridElementWidthInv static_castfloat(FRAME_GRID_COLS) / static_castfloat(mnMaxX - mnMinX);mfGridElementHeightInv static_castfloat(FRAME_GRID_ROWS) / static_castfloat(mnMaxY - mnMinY);fx K.atfloat(0, 0);fy K.atfloat(1, 1);cx K.atfloat(0, 2);cy K.atfloat(1, 2);invfx 1.0f / fx;invfy 1.0f / fy;// 计算完成,标志复位mbInitialComputations false;}mvpMapPoints vectorMapPoint *(N, static_castMapPoint *(NULL)); // 初始化本帧的地图点mvbOutlier vectorbool(N, false); // 标记当前帧的地图点不是外点mb mbf / fx; // 计算双目基线长度// step6. 将特征点分配到网格中AssignFeaturesToGrid();
}
1.1 成员函数
成员函数类型定义ORBextractor* mpORBextractorLeftORBextractor* mpORBextractorRight public 左右目图像的特征点提取器void ExtractORB(int flag, const cv::Mat im) public进行ORB特征提取 cv::Mat mDescriptors,cv::Mat mDescriptorsRight public左右目图像特征点描述子std::vectorcv::KeyPoint mvKeys,std::vectorcv::KeyPoint mvKeysRight public畸变矫正前的左/右目特征点 std::vectorcv::KeyPoint mvKeysUn public畸变矫正后的左目特征点std::vectorfloat mvuRight public左目特征点在右目中匹配特征点的横坐标(左右目匹配特征点的纵坐标相同)std::vectorfloat mvDepth public特征点深度 float mThDepth public判断单目特征点和双目特征点的阈值深度低于该值得特征点被认为是双目特征点深度低于该值得特征点被认为是单目特征点
1.2 成员变量
成员变量类型定义mbInitialComputations public static变量是否需要为Frame类的相机参数赋值初始化为false,第一次为相机参数赋值后变为falsefloat fx, float fy, float cx, float cy, float invfx, float invfy public static变量相机内参cv::Mat mK public 相机内参矩阵float mb public相机基线baseline,相机双目间的距离 float mbfpublic 相机基线baseline与焦距的乘积
Frame类大多与相机相关的参数而且整个系统内的所有Frame对象共享同一份相机参数
2 Frame类的用途
除了少数被选为KeyFrame的帧以外大部分Frame对象的作用仅在于Tracking线程内追踪当前帧位姿不会对LocalMapping线程和LoopClosing线程产生任何影响在mLastFrame和mCurrentFrame更新之后就被系统销毁了。 Reference:
https://github.com/raulmur/ORB_SLAM2https://github.com/electech6/ORB_SLAM2_detailed_comments/tree/master 须知少时凌云志曾许人间第一流。 ⭐️