在跟踪线程中,构造图像帧。

mCurrentFrame = Frame(mImGray,                //灰度图timestamp,              //时间戳mpORBextractorLeft,     //ORB特征提取器mpORBVocabulary,        //词典mK,                     //相机内参矩阵mDistCoef,              //相机的去畸变参数mbf,                    //相机基线*相机焦距mThDepth);              //内外点区分深度阈值

  在Frame的构造函数中,首先根据传入的相关参数给Frame类中的根金字塔相关的元素,然后提取ORB特征。
一、ORB特征提取

void Frame::ExtractORB(int flag, const cv::Mat &im)
{// 判断是左图还是右图if(flag==0)// 左图的话就套使用左图指定的特征点提取器,并将提取结果保存到对应的变量中 // 这里使用了仿函数来完成,重载了括号运算符 ORBextractor::operator() (*mpORBextractorLeft)(im,               //待提取特征点的图像cv::Mat(),       //掩摸图像, 实际没有用到mvKeys,           //输出变量,用于保存提取后的特征点mDescriptors); //输出变量,用于保存特征点的描述子else// 右图的话就需要使用右图指定的特征点提取器,并将提取结果保存到对应的变量中 (*mpORBextractorRight)(im,cv::Mat(),mvKeysRight,mDescriptorsRight);
}
  • 构建图像金字塔:ComputePyramid(image);
void ORBextractor::ComputePyramid(cv::Mat image)
{//开始遍历所有的图层for (int level = 0; level < nlevels; ++level){//获取本层图像的缩放系数float scale = mvInvScaleFactor[level];//计算本层图像的像素尺寸大小Size sz(cvRound((float)image.cols*scale), cvRound((float)image.rows*scale));//全尺寸图像。包括无效图像区域的大小。将图像进行“补边”,EDGE_THRESHOLD区域外的图像不进行FAST角点检测Size wholeSize(sz.width + EDGE_THRESHOLD*2, sz.height + EDGE_THRESHOLD*2);// 定义了两个变量:temp是扩展了边界的图像,masktemp并未使用Mat temp(wholeSize, image.type()), masktemp;// mvImagePyramid 刚开始时是个空的vector<Mat>// 把图像金字塔该图层的图像指针mvImagePyramid指向temp的中间部分(这里为浅拷贝,内存相同)mvImagePyramid[level] = temp(Rect(EDGE_THRESHOLD, EDGE_THRESHOLD, sz.width, sz.height));// Compute the resized image//计算第0层以上resize后的图像if( level != 0 ){//将上一层金字塔图像根据设定sz缩放到当前层级resize(mvImagePyramid[level-1],  //输入图像mvImagePyramid[level],    //输出图像sz,                       //输出图像的尺寸0,                         //水平方向上的缩放系数,留0表示自动计算0,                          //垂直方向上的缩放系数,留0表示自动计算cv::INTER_LINEAR);      //图像缩放的差值算法类型,这里的是线性插值算法// //!  原代码mvImagePyramid 并未扩充,上面resize应该改为如下// resize(image,                 //输入图像//       mvImagePyramid[level],   //输出图像//       sz,                      //输出图像的尺寸//        0,                       //水平方向上的缩放系数,留0表示自动计算//     0,                       //垂直方向上的缩放系数,留0表示自动计算//     cv::INTER_LINEAR);       //图像缩放的差值算法类型,这里的是线性插值算法//把源图像拷贝到目的图像的中央,四面填充指定的像素。图片如果已经拷贝到中间,只填充边界//这样做是为了能够正确提取边界的FAST角点//EDGE_THRESHOLD指的这个边界的宽度,由于这个边界之外的像素不是原图像素而是算法生成出来的,所以不能够在EDGE_THRESHOLD之外提取特征点          copyMakeBorder(mvImagePyramid[level],                   //源图像temp,                                  //目标图像(此时其实就已经有大了一圈的尺寸了)EDGE_THRESHOLD, EDGE_THRESHOLD,           //top & bottom 需要扩展的border大小EDGE_THRESHOLD, EDGE_THRESHOLD,         //left & right 需要扩展的border大小BORDER_REFLECT_101+BORDER_ISOLATED);     //扩充方式,opencv给出的解释:}else{//对于第0层未缩放图像,直接将图像深拷贝到temp的中间,并且对其周围进行边界扩展。此时temp就是对原图扩展后的图像copyMakeBorder(image,            //这里是原图像temp, EDGE_THRESHOLD, EDGE_THRESHOLD, EDGE_THRESHOLD, EDGE_THRESHOLD,BORDER_REFLECT_101);            }// //! 原代码mvImagePyramid 并未扩充,应该添加下面一行代码// mvImagePyramid[level] = temp;}
}

mvImagePyramid[level]存储金字塔第level层的图像。

  • 计算金字塔每层的FAST角点,并将特征点均匀化:使用四叉树的方式计算每层图像的特征点,并进行分配ComputeKeyPointsOctTree(allKeypoints)。
1、首先在图像四周去掉长度为3个单位像素点的边界,这是因为提取FAST角点时,用的半径是3的圆。
2、对去掉边界的图像网格化,分成每个窗口的大小为30个像素的正方形(使得特征分布比较均匀),然后对每个图像块进行FAST角点的提取。
3、将每个窗口的关键点存入vToDistributeKeys容器中,暂时保存第level层图像的关键点。
4、将每层的vToDistributeKeys送入到DistributeOctTree()中进行关键点剔除和平分配。
5、分层计算关键点的方向
for (int level = 0; level < nlevels; ++level)computeOrientation(mvImagePyramid[level],    //对应的图层的图像allKeypoints[level],  //这个图层中提取并保留下来的特征点容器umax);                  //以及PATCH的横坐标边界
  • 描述子的计算
static void computeDescriptors(const Mat& image, vector<KeyPoint>& keypoints, Mat& descriptors,const vector<Point>& pattern)
{//清空保存描述子信息的容器descriptors = Mat::zeros((int)keypoints.size(), 32, CV_8UC1);//开始遍历特征点for (size_t i = 0; i < keypoints.size(); i++)//计算这个特征点的描述子computeOrbDescriptor(keypoints[i],                //要计算描述子的特征点image,                  //以及其图像&pattern[0],                 //随机点集的首地址descriptors.ptr((int)i)); //提取出来的描述子的保存位置
}

二、检查是否成功提取了本帧特征点,如果没有就放弃本帧
三、对提取的特征点进行畸变矫正
四、初始化本帧的地图点
五、将特征点分配到图像网格中

参考
https://wym.netlify.app/slam/

ORB-SLAM2-----Frame()相关推荐

  1. ORB SLAM2源码解读(三):Frame类

    文章目录 前言 构造函数 双目相机 RGBD相机 单目相机 ExtractORB:提取特征点 ComputeBoW:计算词袋数据 SetPose:设置相机外参 isInFrustum:判断一个MapP ...

  2. orbslam2可视化_[Ubuntu] ORB SLAM2 编译调试

    ORB SLAM2 是 2015年比较受到关注的一篇文章,它的主要思想是借助 ORB 描述子改进了 Sparse SLAM 的性能,使得其在稳定性和速度上都达到了比较好的程度.从创新性上来讲,它的主要 ...

  3. Ubuntu下使用单目相机运行ORB SLAM2

    环境:Ubuntu16.04+ROS Kinetic+USB单目摄像头 虽然ORB SLAM2的官方说明中表示没有ROS也可以编译运行,但要实时的跑ORB SLAM2还是需要ROS平台的,所以之前没有 ...

  4. Ubuntu 16.04~ORB SLAM2~Kinect v1

    额 Ubuntu16.04 ORB-SLAM2实现(kinect V1/ROS) ----------------------------------------------------------- ...

  5. Ubuntu14.04 使用本地摄像头跑ORB SLAM2

    嗯 这个方法我暂时弄不出来,用了另外一个方法:SLAM14讲 第一次课 使用摄像头或视频运行 ORB-SLAM2 前面的准备: Ubuntu14.04安装 ROS 安装步骤和问题总结 Ubuntu14 ...

  6. 新手入门新电脑安装配置orb slam2 一步到位不踩坑(ubutun18.04)

    目录 一.安装基础工具 二.安装Pangolin,作为可视化和用户界面 三.安装OpenCV,用于处理图像和特征 (1)下载OpenCV 3.4.1 (2)安装依赖项 (3)编译安装 (4)配置环境, ...

  7. ORB SLAM学习--跑自己数据集图片序列或摄像头或视频(转)

    转自:用ORB SLAM2跑自己的数据集 使用图片序列或摄像头或视频 实践篇_不二青衣的博客-CSDN博客_orbslam2运行自己的数据集 学习 做实验参考使用,侵权则删 用ORB SLAM2跑自己 ...

  8. orb特征 稠密特征_一种基于ORB-SLAM2的双目三维稠密建图方法技术

    本发明专利技术公开了一种基于ORB‑SLAM2的双目稠密建图方法,涉及机器人同步定位与地图创建领域,该方法主要由跟踪线程.局部地图线程.闭环检测线程和稠密建图线程组成.其中稠密建图线程包含以下步骤:1 ...

  9. ORB-SLAM2从理论到代码实现(十二):Frame类

    Frame是帧,也就是对应一帧图像,可以是单目.双目.RGBD,所以该类所包含的操作就是SLAM中以帧为单位进行的处理,主要包括以下方面: 读写该帧对应的相机位姿 处理帧和特征点之间的关系,包括判断特 ...

  10. ORB-SLAM2源码解析(一):ORB算法

    ORB-SLAM2源码解析(一):ORB算法 目录 一.前言 二.ORB算法原理 三.ORB-SLAM2中ORB算法代码注释分析 四.与opencv中ORB对比测试 五.总结 六.参考 一.前言 目前 ...

最新文章

  1. 使用Python和OpenCV实现超快速,简单的伽玛校正功能
  2. Hangry 饥饿成怒 2016-10-03
  3. python图片处理裁剪大小、旋转、镜像
  4. linux下配置多网卡或多IP的方法
  5. 包装严重的 IT 行业,作为面试官,我是如何甄别应聘者的包装程度
  6. ExpandableListView用法的一个简单小例子
  7. 08.15《CEP职业发展规划课》
  8. php柱状图实现年龄分布,考官雅思写作小作文满分范文 柱状图:年龄分布
  9. 天气数据获取接口和网址汇总
  10. Flask框架——ORM数据库
  11. no plugin found for prefix ‘tomcat 7‘ in the current project and in the plugin groups的解决方法
  12. 【LeetCode】贪心算法--分发糖果(135)
  13. iOS-OpenGLES 简单渲染
  14. java图片自动盖章,一种自动盖章装置的制作方法
  15. excel制作折线图
  16. 如何计算机网络打印机,如何共享网络打印机 共享网络打印机教程详解
  17. 【vscode简单入门(三)】vscode巨实用的基础插件推荐(不定期更新)
  18. SD-WAN,边缘网络和安全性大热
  19. 晶圆激光切割工艺流程
  20. matlab 序列对称,共轭对称序列.PPT

热门文章

  1. bim webgl 模型 轻量化_WebGL轻量化BIM引擎如何加载大体量BIM模型
  2. UNIX环境高级编程——进程关系
  3. APICloud使用记录——创建项目
  4. 微信小程序地图标记点marker,点击标记点显示详细信息
  5. 密码学的中文入门书籍及课程推荐
  6. pixhawk连接到nvidia xavier
  7. 剖析环境加密与文档加密
  8. Ubuntu 20.10 引导修复(boot repair)
  9. 【软件测试】白盒测试方法与黑盒测试方法的区别
  10. R语言作图好看的秘籍:RColorBrewer调色板详解