当前位置: 首页 > news >正文

提供购物网站建设电子商务网站的建设开发工具

提供购物网站建设,电子商务网站的建设开发工具,公众号微博seo,seo入门培训学校写orbslam2代码解读文章的初衷 首先最近陆陆续续花了一两周时间学习视觉slam#xff0c;因为之前主要是做激光slam#xff0c;有一定基础所以学的也比较快#xff0c;也是看完了视觉14讲的后端后直接看orbslam2的课#xff0c;看的cvlife的课#xff08;课里大部分是代码…写orbslam2代码解读文章的初衷 首先最近陆陆续续花了一两周时间学习视觉slam因为之前主要是做激光slam有一定基础所以学的也比较快也是看完了视觉14讲的后端后直接看orbslam2的课看的cvlife的课课里大部分是代码的解读所以还是需要一定的视觉slam基础但是说实话课是看完了其实还是会有一些疑问想着通过自己整体再梳理一遍加深印象的同时能够解决自己的疑惑。最后一点这个课的课件真的乱最好通过自己的整理把整个框架串起来理解。后续的代码讲解流程主要围绕单目来展开因为单目相对而言过程更复杂而双目和rgbd因为有深度信息所以了解单目之后它们的处理过程也更容易了解 论文代码的整体框架图 原论文的插图 cvlife课中转换成中文的框架图 内容都是一致的分成三个主要的线程 跟踪tracking线程。求解当前图像帧在世界坐标系下的位姿处理的是任意普通帧完成定位的功能。局部建图localmapping线程。根据产生的新关键帧产生新的地图点以便后续跟踪的时候pnp的时候用还有需要局部BA只优化局部关键帧的位姿。回环Loop closing线程。根据localmapping线程传过来的关键帧进行回环检测如果有候选回环帧就计算sim3修正当前关键帧及其共视关键帧的位姿和地图点然后进行本质图优化仅优化位姿最后就是全局BA优化地图点和位姿。 SLAM系统的运行流程 主函数 首先看mono_tum.cc 简化版的主函数单目情况 int main(int argc, char **argv) {LoadImages(strFile, vstrImageFilenames, vTimestamps);ORB_SLAM2::System SLAM(argv[1],argv[2],ORB_SLAM2::System::MONOCULAR,true);for(int ni0; ninImages; ni){im cv::imread();SLAM.TrackMonocular(im,tframe);}SLAM.Shutdown();SLAM.SaveKeyFrameTrajectoryTUM(KeyFrameTrajectory.txt); }声明了一个单目的SLAM对象。遍历数据集的图像并且传给SLAM对象的单目track函数。最后关闭SLAM并且保存关键帧的轨迹。 后续调用的函数 SLAM.TrackMonocular(im,tframe) 这个SLAM.TrackMonocular(im,tframe);函数里主要是通过mpTracker来进行跟踪并且最终返回当前图像帧的位姿估计结果。 //获取相机位姿的估计结果cv::Mat Tcw mpTracker-GrabImageMonocular(im,timestamp);mpTracker-GrabImageMonocular(im,timestamp) 这个mpTracker-GrabImageMonocular(im,timestamp)函数处理过程 如果图像是彩色图就转成灰度图如果当前帧是初始化的帧那么在构建Frame的时候提取orb特征点数量为正常的两倍目的就是能够在初始化的时候有更多匹配点对如果是普通帧就正常构建Frame。接着就是调用tracking线程中的Track()函数。这个下一篇再描述返回当前图像帧的位姿估计结果。 这个mpTracker-GrabImageMonocular(im,timestamp)函数对应第3、4步骤 // Step 3 跟踪Track();//返回当前帧的位姿return mCurrentFrame.mTcw.clone();数据处理流程 数据处理主要发生在mpTracker-GrabImageMonocular(im,timestamp)函数中第2步根据当前帧灰度图构造Frame对象。 // Step 2 构造Frame//判断该帧是不是初始化if(mStateNOT_INITIALIZED || mStateNO_IMAGES_YET) //没有成功初始化的前一个状态就是NO_IMAGES_YETmCurrentFrame Frame(mImGray,timestamp,mpIniORBextractor, //初始化ORB特征点提取器会提取2倍的指定特征点数目mpORBVocabulary,mK,mDistCoef,mbf,mThDepth);elsemCurrentFrame Frame(mImGray,timestamp,mpORBextractorLeft, //正常运行的时的ORB特征点提取器提取指定数目特征点mpORBVocabulary,mK,mDistCoef,mbf,mThDepth);Frame的构造流程 step1 普通帧的id自增注意普通帧和关键帧的id并不一样它们分别是Frame和KeyFrame类中的一个静态变量普通帧的id可能只是为了统计处理了多少个图像而关键帧的id需要结合后续的回环检测和全局BA又或者是共视关键帧等等去使用。 step2 设置图像金字塔的参数。根据配置文件去设置我看到TUM1.yaml是金字塔层级8缩放系数是1.2。 step3 根据灰度图提取ORB特征点。提取的代码主要是在ORBextractor.cc中的括号运算符重载函数中。 /*** brief 用仿函数重载括号运算符方法来计算图像特征点* * param[in] _image 输入原始图的图像* param[in] _mask 掩膜mask* param[in out] _keypoints 存储特征点关键点的向量* param[in out] _descriptors 存储特征点描述子的矩阵*/ void ORBextractor::operator()( InputArray _image, InputArray _mask, vectorKeyPoint _keypoints,OutputArray _descriptors)这个函数的步骤如下 检查图像有效性如果为空就退出。构建图像金字塔 2.1按照缩放系数获得本级金字塔的图像并且扩展图像的边界。图中说的比较清晰了一个是为了提取fast特征点预留的另一个是为了高斯模糊预留的 2.2最终得到8个图像vectorMat的容器用于后续提取特征点。计算图像的特征点 3.1 将每个金字塔图层的图像按照网格一个一个来进行FAST点的提取如下面红色网格。 提取FAST角点的过程可以看下面的图 选取像素点p灰度为 I p I_p Ip​ 设定一个阈值T 以像素点p为圆心选择半径为3圆上的16个像素点 遍历16个像素点如果有连续N个点的亮度大于 I p T I_pT Ip​T或 I p − T I_p-T Ip​−T认为p是特征点 对每一个像素重复上面的操作 3.2 将每个金字塔图层的特征点数量根据四叉树的方法平均分布特征点四叉树的结果如下图所示最后每个网格留下质量最好的点 需要注意的是每个金字塔因为长宽不同所以根据金字塔图像长度的不同将每次普通帧需要提取设定的点数配置文件中是1000个按照公式设定每个金字塔图像保留多少个特征点 3.3 根据灰度质心法计算每个金字塔图层中特征点的方向。这个是为了让后面的brief描述子具有旋转不变性的。去特征点周围半径为HALF_PATCH_SIZE的像素来计算局部图像的质心公式如下 m 10 ∑ x − R R ∑ y − R R x I ( x , y ) m 01 ∑ x − R R ∑ y − R R y I ( x , y ) \begin{aligned} m_{10}\sum_{x-R}^R \sum_{y-R}^R x I(x, y) \\ m_{01}\sum_{x-R}^R \sum_{y-R}^R y I(x, y)\end{aligned} ​m10​x−R∑R​y−R∑R​xI(x,y)m01​x−R∑R​y−R∑R​yI(x,y)​ m 00 ∑ x − R R ∑ y − R R I ( x , y ) m_{00}\sum_{x-R}^R \sum_{y-R}^R I(x, y) m00​∑x−RR​∑y−RR​I(x,y) 得到质心的位置 C ( c x , c y ) ( m 10 m 00 , m 01 m 00 ) C\left(c_x, c_y\right)\left(\frac{m_{10}}{m_{00}}, \frac{m_{01}}{m_{00}}\right) C(cx​,cy​)(m00​m10​​,m00​m01​​) 最后根据质心位置计算当前特征点的方向 θ arctan ⁡ 2 ( c y , c x ) arctan ⁡ 2 ( m 01 , m 10 ) \theta\arctan 2\left(c_y, c_x\right)\arctan 2\left(m_{01}, m_{10}\right) θarctan2(cy​,cx​)arctan2(m01​,m10​) 在这部分的计算中为了加快计算质心的位置程序里是根据提前算好的u_max同时对两行进行计算具体的代码就不详细展开了。 这里留下一个疑问这里计算质心的PATCH的大小每个金字塔图层都用了一样的大小PATCH的大小是30。这应该需要根据金字塔图层来改变 将每一层金字塔图像进行高斯模糊后高斯模糊有利于减少噪点的影响将保留下来的每个特征点都计算它们的brief描述子这个描述子结合了特征点的方向所以最终具备旋转不变性。 brief描述子的计算过程 在关键点的周围以一定模式选取N个点对在代码中是256个点对 τ ( p ; x , y ) : { 1 if  p ( x ) p ( y ) 0 otherwise  \tau(\mathbf{p} ; \mathbf{x}, \mathbf{y}): \begin{cases}1 \text { if } \mathbf{p}(\mathbf{x})\mathbf{p}(\mathbf{y}) \\ 0 \text { otherwise }\end{cases} τ(p;x,y):{10​ if p(x)p(y) otherwise ​ 根据公式计算每一个位的数一共是256位描述子 注意这256个点对是预先设定好在程序中的应该是orbslam2作者通过机器学习得到的结果。最后就是根据这256对索引取值的时候需要用上前面计算的特征点角度具体操作如下图所示256对点本来在图像的坐标系上需要转到PQ为X轴的坐标系上再计算brief描述子这时候的brief描述子就具备了旋转不变性。 step4 通过opencv对图像进行畸变矫正。其实就是根据标定好的畸变矫正系数 k 1 k_1 k1​、 k 2 k_2 k2​、 p 1 p_1 p1​、 p 2 p_2 p2​来对图像进行去畸变。 最后用校正后的特征点像素坐标覆盖特征点的老像素坐标。 step5 将特征点分配到图像网格中。目的应该就是为了方便后续两个图像帧之间的特征点配对。 总结 至此就已经讲完了数据预处理的过程主要的处理代码都是在Frame的构造函数当中根据一帧图像构建了一个Frame对象里面存储着很多关键信息每个金字塔图层的特征点及其对应旋转不变性的Rotated BRIEF还对特征点进行去畸变。
http://www.zqtcl.cn/news/614553/

相关文章:

  • 威宁做网站西部数码网站管理助手 没有d盘
  • 网站设计基础知识重庆seo博客推广
  • 中小企业商务网站建设wordpress dmeng
  • 关于网站建设总结公司网站购买主机
  • 定制网站与模板网站网页美工设计师工资
  • 丹棱县 网站建设wordpress公司主题破解版
  • 贾汪微网站开发百度推广登录账号首页
  • 网站开发和网站运营的区别嘉兴市秀洲区住房和建设局网站
  • 西安网站开发公司哪家强如何做付费阅读网站
  • ios认证 东莞网站建设天津企业网站建设方案
  • 高网站排名吗wordpress 拼音别名
  • 网站出现的问题杭州旅游网站建设
  • 陕西城乡建设部网站怎么用自己注册的域名做网站
  • 企业邮箱注册价格汕头做网站优化的公司
  • 高校工会网站建设网站静态页面生成
  • 辽宁省营商环境建设局 网站做网站前端后端ui什么意思
  • 合作社网站模板贵州安顺建设主管部门网站
  • 网站不备案能访问吗哪家做企业网站
  • 做网站写的代号好跟不好的区别企信网企业信用信息系统
  • 网站需要服务器吗手机网站解决方案
  • 网站子网页怎么做国外网站 模板
  • 手机评测网站标志设计分析
  • 网页游戏网站建设成都公司网站
  • 网站流量统计分析的误区wordpress二级目录安装
  • 深互动平台网站wordpress后台无法访问
  • 建立网站需要服务器吗网站建设辶首先金手指十四
  • 做的成功的地方网站办公室工装设计公司
  • 怎样添加网站上百度商桥代码网站建设实验报告手写
  • 江阴做网站优化辽宁世纪兴电子商务服务中心
  • 最新创建的网站搭建网站的平台有哪些