BA优化PnP的思路
由之前的PnP,可以求出一个R,t,K又是已知的。而且空间点的世界坐标知道,第二个相机位姿的像素坐标也是知道的。就可以利用它们进行优化。
首先确定变量为const vector<Point3f> points_3d,const vector<Point2f>,const Mat& K,Mat& R,Mat& t.
因为之后放进去的pts_3d,pts_2d是我们自己计算出来的,所以不用用&。
开始函数:
1.初始化g2o.这个可以是固定的方式。基本上都是相似的。
定义矩阵块的类型为Block.这样方便之后的写入。它有两个参数,第一个参数为优化变量的维度,这里为6,第二个参数为误差值的维度,这里为3。
typedef g2o::BlockSolver<g2o::BlockSolverTraits<6,3>> Block;
定义线性求解器的类型linearsolver要带指针,有稠密Dense和CSparse两种类型。前面要加new.参数为矩阵块里的位姿矩阵类型
LinearSolverType* linearsolver=new g2o::LinearSolver::CSparse<Block::PoseMatrixType>();
定义矩阵块的求解器solver_ptr。要带指针。也要带new.g2o赋初值的都要带new.
Block* solver_ptr=new Block(linearsolver);
定义梯度下降方法为levenberg方法solver.
g2o::OptimizationAlgorithmLevenberg* solver=new g2o::OptimizationAlgorithmLevenberg(solver_ptr);
步骤就是,先把复杂的矩阵块类型在这里定义为Block.然后定义线性方程求解器linearsolver,再定义矩阵块求解器solver_ptr和linearsolver有关,再定义梯度下降方法solver和solver_ptr有关。
定义图模型optimizer.类型为g2o::SparseOptimizer.
然后设置图模型的求解器,也就是之前定义的梯度下降方法。
optimizer.setAlgorithm(solver);
设置要不要打开调试输出,设置为true.这个选项有的时候可以不设
optimizer.setVerbose(true)
2.设置顶点有关的东西,这里有两个顶点,一个是李代数位姿pose,一个是空间点位置p。
李代数位姿顶点类型为g2o::VertexSE3Expmap*,初值为new g2o::VertexSE3Expmap();
顶点要设置两个东西,一个是Id,一般设为0,一个是Estimate,这里是由R,t组成的SE3Quat形式。只要把R,t放进去就可以了。但是R必须是矩阵形式。由之前的R.at<double>(0,0)等转化。t必须是向量,由t.at<double>(0,0)等转化。
至于空间点式的顶点,就需要一个for循环了,因为空间点有很多啊。、
for(const Point3f p:points_3d)
顶点设为point,类型为g2o::VertexSBAPointXYZ,初值为new g2o::VertexSBAPointXYZ();
Id设为index++,估计值设为p.x,p.y,p.z的组成的向量形式。还设置了一个setMarginalized(true).
3相机参数
里面还用到了相机参数camera.类型为g2o::CameraParmetersI,值为K.at<double>(0,0),和cx,cy组成的2维向量,0组成的。
Id设置为0,
4.边。
重点是边了。边肯定在一个for循环里,这里是for(const Point2f p:points_2d)
边的类型为g2o::EdgeProjectXYZ2UV,初值为new g2o::EdgeProjectXYZ2UV().
设置id为index,
设置顶点0为空间点位置,而且里面用了一个dyanmic_cast把图模型的顶点坐标设置为空间点顶点类型。
edge->setVertex(0,dynamic_cat<g2o::VertexSBAPointXYZ*>(optimizer.vertex(index)));
设置顶点1为位姿。
edge->setVertex(1,pose);
设置测量值为p.x,p.y组成的2维向量模式。
设置参数ID为(0,0).
edge->setMeasurement(Eigen::Vector2d(p.x,p.y));
edge->setParameterId(0,0);
设置信息矩阵为2维的单位矩阵。信息矩阵的维度是根据误差值的维度定的。
5.求解
求解就特别简单,先把图模型给初始化一下。
optimizer.IntializeOptimization();
直接用优化函数optimize()进行优化。
optimizer.optimize(100)
由优化可以得到位姿的估计值。pose->estimate.要想把它转成常见形式,可以用欧式变换矩阵Eigen::Isometry3d,是4*4矩阵,
T=Eigen::Isometry3d(pose->estimate()).matrix
BA优化PnP的思路的更多相关文章
- Web性能优化:基本思路和常用工具
听了荣华的演讲之后,我对性能优化有了更深层次的认识. 性能优化的重要性 性能优化是为了赢得用户,为了降低成本. 性能优化思路 Web常见优化点 Java常见排查工具
- sqlserver sql优化案例及思路
始sql: SELECT TOP 100 PERCENT ZZ.CREW_NAME AS 机组, ZZ.CREW_ID, AA.年度时间, CC.当月时间, DD.连续七天时间 AS 最近七天 FRO ...
- Oracle sql的基本优化写法和思路。
首先简单介绍下常规的sql优化的方式: 1.肯定有人说建索引啊. 2.数据量实在太大,建分区啊. 3.其实基于目前公司的业务还有一种办法那就是向上聚集表.根据查询业务,专门抽取上来一张表,直接做到se ...
- web服务器优化的一些思路
作为一个新手(并不是菜鸟,而是像我们这样的学生),维护一个网站往往是一个很头疼的问题,尤其是动态网站,更尤其是用java写的网站. 当网站的吞吐量很小的时候你会发现服务器根本不需要维护,因为几乎没有延 ...
- Oracle性能优化1-总体思路和误区
最近在看梁敬彬老师关于Oracle性能优化的一些案例,在这里做一些简单的总结 1.COUNT(*)与COUNT(列)哪个更快 drop table t purge; create table t as ...
- 01-MySQL优化大的思路
首先不是看它的表结构等等.从整体上去观察,不断去看它的状态.这个状态往往不是一两个小时可以看出来的,得写一个脚本,观察它的24小时的周期性变化,不断刷新它的脚本,观察它的Status.主要是看它有没有 ...
- mysql数据库优化 几个思路
建表: 合理的索引, 组合索引 合理的字段类型 合理的表结构和表关联关系 查询: 避免: *, 函数 , 计算 , like左右全匹配 , in , beteewn?? 索引和组合索引 子查询 ...
- 8.2 Query 语句优化基本思路和原则
在分析如何优化MySQL Query 之前,我们需要先了解一下Query 语句优化的基本思路和原则.一般来说,Query 语句的优化思路和原则主要提现在以下几个方面: 1. 优化更需要优化的Query ...
- 【Mysql 优化 6】mysql优化的内容和思路
根据最近做mysql优化,以及参照的官方文档的一些知识点,总结一下,如何下手去优化mysql 数据库.PS:更多可能是我个人的笔记总结记录,仅供参考 一.优化的内容 可以优化的内容,从范围的大小,可以 ...
随机推荐
- C#控件之ListView
1.添加一行 listView1.Items.Add(new ListViewItem(new string[] {str1, str2, str3 })); 2.鼠标悬停在listview某项时弹出 ...
- es6 - 模板
'use strict'; // es5 let name = 'mrs'; let qb = 20; function logs() { return 'goods!'; } let html = ...
- 4种使用webpack提升vue应用的方式
本文参考自:https://mp.weixin.qq.com/s?src=11×tamp=1526886111&ver=889&signature=u9SixhvlJ ...
- 何为SLAM
名词解释: SLAM (simultaneous localization and mapping),也称为CML (Concurrent Mapping and Localizatio ...
- 在VS2013中打开Nuget
1.工具→NuGet程序包管理器→程序包管理控制台 2.没有的话,就去 工具→扩展和更新 搜索nuget
- yosemite开启HAXM硬件加速执行安卓虚拟机
android sdk安装HAXM发现不能正常执行 $ kextstat | grep intel 发现无进程执行 $ sudo kextload –b com.intel.kext.intelhax ...
- 效率提升最重要的原则 - Doing one thing at a time
前段时间流行的时间管理方法 - url=NotLrz-4f4eCgENFAECrXNw88mSLoJ2Rc2MrkP4aes1yQvPjNQRlmdYcbz9oP9U8JoBzJeY-DSUhhInx ...
- Perl语言学习笔记 15 智能匹配与give-when结构
1.智能匹配操作符 替代绑定操作符: 在哈希中查找某一个键: 比較两个数组是否全然同样: 查找列表中是否存在某个元素: 智能匹配操作符与顺序无关.~~ 左右元素能够互换 2.智能操作符优先级 3.gi ...
- Jquery 常用方法总结
1.Attribute(属性): $(”p”).addClass(css中定义的样式类型); 给某个元素添加样式 $(”img”).attr({src:”test.jpg”,alt:”test Ima ...
- C#的类型列表
以下是 C# 内建类型的列表: 类型 字节 描述 unsigned byte signed byte signed short unsigned short signed integer unsign ...