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

哈尔滨网站建设哈尔滨网站标题用什么隔开

哈尔滨网站建设哈尔滨,网站标题用什么隔开,网站模板 wordpress带会员系统,怎么用域名建网站文章目录 1.点所构成的残差Residual的管理1.1.前端残差的状态1.2.后端点的残差的状态1.3.点的某个残差的删除 2.点Point的管理2.1.如何删除点——点Point的删除2.2.边缘化时删除哪些点#xff1f; 3.帧FrameHessian的管理 DSO代码注释#xff1a;https://github.com/Cc19245/… 文章目录 1.点所构成的残差Residual的管理1.1.前端残差的状态1.2.后端点的残差的状态1.3.点的某个残差的删除 2.点Point的管理2.1.如何删除点——点Point的删除2.2.边缘化时删除哪些点 3.帧FrameHessian的管理 DSO代码注释https://github.com/Cc19245/DSO-CC_Comments 1.点所构成的残差Residual的管理 1.1.前端残差的状态 PointFrameResidual的状态有三种 IN——内点。表示这个残差状态正常可以参与优化 OOB——Out Of Boundary出界点。表示把host帧上的点通过线性化点或最新状态的相机位姿投影到target帧之后这个点不在图像范围内表示这个点出界了那么这个残差不能参与优化。 注意一个残差只要被判断为出界后面就再也不用他了作者代码中也有一句注释叫做can never go back from OOB。这个确实也是有道理的因为前端已经跟踪得到了一个初始位姿了有投影匹配的点是不太可能出界的。 OUTLIER——外点表示这个残差能量超过了阈值注意和OOB区分。外点类似于特征点法中的无匹配也就是找到了匹配关系但是误差太大如果使用它优化会造成不好的影响干脆就不用这个残差。 注意随着优化的进行外点的残差能量有可能会慢慢降低到小于阈值此时它就可以恢复成内点然后继续参与优化。因此外点是可以恢复的。 为了让OOB起到一票否决的作用在代码中使用了state_state变量表示这个残差上次的状态一旦它上次的状态是OOB那么函数都会直接跳过或返回从而这个残差永远不可能再次参与到优化中。 1.2.后端点的残差的状态 EFResidual的状态就比较简单了只有一个变量bool isActiveAndIsGoodNEW来表示这个点能量残差是否在后端优化中使用。这个变量是由前端残差的状态来设置的只有前端残差的状态是IN这个变量才是true否则全都是false。 那么什么时候设定后端残差的状态呢就是调用applyRes把前端雅克比传递给后端的时候此时会一并把前端残差的状态传递给后端让后端残差的状态得到更新。下面对几个函数进行说明 PointFrameResidual::linearize 1前端残差进行线性化求雅克比。注意这个过程中有两部分雅克比 一个是像素点关于相机位姿、内参、逆深度部分雅克比它们使用线性化点的状态保持不变另一个是像素梯度和残差它们使用最新的状态因此是变化的。 2在此过程中会判断前端残差的状态存储到前端残差的类成员变量中。 PointFrameResidual::applyRes 把前端残差更新到后端同时把前端残差的状态也更新到后端这个很正常因为残差都给后端了自然也要告诉后端这个残差是否有效 FullSystem::linearizeAll_Reductor(true/false) 1一定会调用PointFrameResidual::linearize计算最新的雅克比并且判断前端残差状态。 2如果传入true会把前端雅克比和残差状态更新到后端并且把前端非IN状态的残差放到toRemove数组中。 FullSystem::linearizeAll(true/false) 1一定会调用FullSystem::linearizeAll_Reductor(true/false)。 2如果传入true那么会把linearizeAll_Reductor函数里统计出来的非IN状态的残差从PointHessian和后端优化的大bossEnergyFunctional中丢弃也就是这个残差不再存在了。 注意什么时候这个函数会传入true呢答案是只有在完成迭代优化的循环之后才会传入true因为此时已经得到了本次滑窗优化的最终结果可以把使用这个最终结果判断的非IN状态的残差从前端和后端删掉了。但是其他任何时候比如迭代优化之前或迭代优化过程中我们只能对残差求雅克比、判断它们状态如果不是IN那么后端优化就不使用但是我们不能把这些残差删掉因为优化还没开始或者还没完成可能这次是OUTLIER的残差优化几次就变成了IN所以我们不能删掉这些残差。 1.3.点的某个残差的删除 如上所述在FullSystem::optimize中后端迭代优化完成后会调用FullSystem::linearizeAll(true)根据最新的状态把所有残差重新线性化一次由于传入了true所以会筛选出非IN状态的残差并把他们删除掉该函数中实现的删除残差的步骤如下 EnergyFunctional::dropResidual删除后端残差先把这个残差从后端能量点的残差数组中弹出然后把前端对应的残差持有的这个后端残差指针置零最后delete释放内存。FullSystem::deleteOut删除前端残差先把前端点的残差数组中要删除位置的残差的指针delete释放到然后把数组最后一个残差赋值到这个位置。其实本质上和删除后端残差的操作一致只不过释放指针和弹出数组的先后顺序不同。 2.点Point的管理 2.1.如何删除点——点Point的删除 如上所述在FullSystem::optimize中后端迭代优化完成后会根据最新的状态把所有残差重新线性化一次同时筛选出非IN状态的残差并把他们删除掉。出了FullSystem::optimize函数之后执行FullSystem::removeOutliers函数把Point的外点删除。 此函数中就是判断所有帧上的所有点如果这个点的残差个数为0那么他就要被删除掉了。所以从这里删除的判断条件来看叫removeOutliers可能不是太恰当可能叫removePointsNonRes即删除没有残差的点更好一点。 下面细看这个函数中的实现步骤 先把这个PointHessian加入到帧的前端点删除数组pointHessiansOut中等待后面统一删除。设置这个前端PointHessian对应的后端EFPoint状态为PS_DROP给后面后端删除EFPoint使用。然后把这个点从帧的点数组中删掉注意这里还没有delete释放这个PointHessian的内存只是把它加入到了外点数组中。调用EnergyFunctional::dropPointsF把后端的点删掉。此函数中调用removePoint该函数中会先把这个EFPoint对应的所有EFResidual删掉然后把这个点从能量帧的点能量数组中删掉最后把这个delete这个能量点释放内存。 注意从上面两步可以看出来这里的代码设计还是有点瑕疵的因为删除前端的点之后没有释放内存而是等待后面统一释放。而删除后端的点则释放了内存前后端的操作不统一了。 7.28最新想法可能作者是故意这样设计的因为看代码中显示部分好像有删除点的数组相关的内容所以就是把这些点存到数组中来显示历史上的所有点 7.29最新想法这个其实是没有问题的确实是作者有意为之而且原因也就是删除的点还要被使用。因为上面也说了要删除的PointHessian指针被放到了前端点的删除数组pointHessiansOut中后面要给显示线程使用。即然被放到了这个数组中自然这个指针就不能释放了否则这个数组中存的就都是野指针了。而把这些点从正常使用的前端点数组pointHessians中弹出就意味着以后肯定无法再使用这个点了因此从系统功能上已经实现了删除这个点的目的。而对于后端来说既然这个点被删除了那么我后端优化肯定就不会使用它构造H/b了因此完全可以把这个点能量EFPoint完全从内存中抹去。 2.2.边缘化时删除哪些点 如上述所说在FullSystem::optimize中后端迭代优化完成后会根据最新的状态把所有残差重新线性化一次同时筛选出非IN状态的残差并把他们删除掉。出了FullSystem::optimize函数之后执行FullSystem::removeOutliers函数把哪些没有残差的Point删除掉。 接下来系统就进入了边缘化的阶段首先是判断哪些点要边缘化掉这样就会利用这些点构成的残差计算一个H/b然后把这些点的逆深度Schur消元掉只保留68x68的相机状态。然后下面对关键帧进行边缘化再把这个H/b消掉一个相机帧得到维度缩减的HM/bM从而给下一帧使用。 那么如何判断哪些点要被边缘化掉或者直接丢掉呢在函数FullSystem::flagPointsForRemoval中实现这些功能。这个函数中选择要边缘化或者删除的点只有两个根据 1即将被边缘化的帧上的点显然帧都没了帧上的点肯定也不能再存在了。所以如果这个点性质比较好比如多次构成的残差足够多、优化的逆深度协方差足够小那么就把它边缘化掉从而给后面的帧形成约束如果这个点的性质不好那么就直接把它丢掉而不能边缘化因为这样可能会引入错误的约束 2其他帧上的点根据性质判断即代码中的PointHessian::isOOB函数内部会判断非边缘化帧上的点是否要被选择边缘化或者丢弃这部分判断准则还不是很明白。 筛选出来这些点之后在代码中就是对这些点进行处理要么边缘化要么直接丢掉。而如果一个点既不是外点也不是要边缘化/丢掉的点那么它就是正常的点会继续存在于滑窗中因此对它不进行任何处理这就是为什么 代码 中elseif后面没有else了也就相当于一个空的else即如果是else则什么也不干。 最后注意跟优化之后接着删除点一样也上面的函数里面也是只把要丢掉的前端点PointHessian放到了删除数组中并且从使用数组中弹出这样就是完成了前端点的删除。而后端的对应的能量点在这个函数中没有释放所以还要再释放后端的能量点但是这个释放放在了FullSystem::flagPointsForRemoval函数外面去调用这是我觉得不太好的地方放在该函数里面调用更好。而且这个函数命名也不准确我觉得命名为MarginOrDropPoints更好也就是边缘化或者丢掉点。同理应该把后面的ef-marginalizePointsF();函数也一并放进里面调用实际就完成了整个点的边缘化。这样拆开反而逻辑没有那么清晰了。 3.帧FrameHessian的管理 在上一步边缘化掉点之后得到了这些点的残差构成的HM/bM矩阵但是这个矩阵中仍然是含有要被边缘化掉的帧的状态的因此还要对这个HM/bM进行Schur消元得到消元之后维度缩减的HM/bM给下次滑窗优化使用。 在后端对边缘化的帧进行Schur消元之后还有一个步骤需要做那就是把其他帧上以被边缘化掉的帧为target帧的那些点的残差删掉这个也是很正常的因为这帧没有了自然其他帧上的点和这帧关联的残差也就没有了。注意这个不是说其他帧上的点也不用了这些点还是和别的帧可以构成残差的所以这个和边缘化/丢掉点是不同的这个是对仍然存在于滑窗中的点的残差进行处理。 而删除点的某个残差则跟上面1.3节讲述的一样了那就是先dropResidual删掉后端残差再deleteOut删除前端残差。 把残差处理完了就要删除这个帧了调用deleteOutOrder函数把这个帧从FullSystem的帧数组中弹出这就保证了它不会在FullSystem中再被调用参与滑窗优化了但是不会释放它的内存。这个跟PointHessian的删除逻辑是一样的本质上是因为这个FrameHessian的指针在优化之前已经被加入到allFrameHistory里面了如果在这里把指针释放了那么allFrameHistory里面存的就是野指针了。 由于删除了滑窗中的一个关键帧所以需要调用setPrecalcValues函数重新计算各个帧的线性化点状态、最新状态、状态增量等变量然后还要调用ef-setAdjointsF重新计算各个帧之间的伴随矩阵。至此帧边缘化的操作全部完成。
http://www.hkea.cn/news/14486289/

相关文章:

  • 档案网站建设书四川企业网站建设
  • 网站排名技巧保定网站建设公司大全
  • 广州科 外贸网站建设wordpress 4.7.8
  • 网站关键词建信建设投资有限公司网站
  • 介绍自己的做的网站吗android网站开发
  • 备案网站管理系统离线修改wordpress主题
  • 三大门户网站行业门户网站的优化怎么做yps行业门户系统
  • dw做汽车网站cms网站开发网站模板
  • 青海省建设厅官方网站青海西宁网站建设
  • 网站建设报价分析免费logo
  • 造价工程建设协会网站wordpress防止图片被采集
  • 网站每年需要续费吗域名收录
  • 卖辅助网站怎么做wordpress 字体调整
  • 机械制造网站上海定制app开发公司
  • 在线手机网站制作网站制作与网站建设
  • 上海网站建设网络公司网站设计流程步骤
  • 做挂件像网站成都网页设计培训学校哪家好
  • 违禁网站用什么浏览器东莞阳光网投诉查看
  • 网站自助制作服装公司网站首页
  • 房屋租赁网站开发背景自己动手做衣服的网站
  • 网站建设书模板开发自己的app多少钱
  • 福建志佳建设工程发展有限公司网站织梦网站数据下载
  • 建设一个网站大概需要多少钱织梦配置手机网站
  • 商务网站规划与建设课程设计网站3级营销是怎么做的
  • 做推广网站的文章术语河南seo推广
  • 成都上市的网站建设公司营销策划书案例
  • 互联网网站建设收费如何做收机微网站
  • 成都网站建设哪家售后好定制开发游戏
  • 威海建设局网站楼盘信息公布外包手工活在哪里拿货
  • 在网站文字上做笔记工业果蔬机械加工网