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:更多可能是我个人的笔记总结记录,仅供参考 一.优化的内容 可以优化的内容,从范围的大小,可以 ...
随机推荐
- Web编程前端之7:web.config详解 【转】
http://www.cnblogs.com/alvinyue/archive/2013/05/06/3063008.html 声明:这篇文章是摘抄周公(周金桥)的<asp.net夜话> ...
- 怎样找出自己定义标签的java类
怎样找出自己定义标签的java类 这是一个逆推的过程(建立自己定义标签能够查看下面连接:http://blog.csdn.net/antoniochan/article/details/3810990 ...
- Linux学习之十一-Linux字符集及乱码处理
Linux字符集及乱码处理 1.字符(Character)是各种文字和符号的总称,包括各国家文字.标点符号.图形符号.数字等.字符集(Character set)是多个字符的集合,字符集种类较多,每个 ...
- 转: 使用maven给spring项目打可直接运行的jar包(配置文件内置外置的打法)
from: http://www.cnblogs.com/hdwang/p/5418747.html
- 【秀优越(xie e)】原来出题也能够这么恶心。
通过邪恶的数据范围和数据限制居然能够把一道传统题出成题答2333. 诶毕竟内部互測,题目就不往上贴了. 特殊限制 - - - 题目作废.输出M行"Orz PoPoQQQ" - M ...
- imagemagick imagick
imagemagick#图像处理软件 安装解压 ./configure make make install imagick#是php图像扩展模块 调用imagemagick处理图像 安装解压/opt/ ...
- HDU 1006 Tick and Tick 解不等式解法
一開始思考的时候认为好难的题目,由于感觉非常多情况.不知道从何入手. 想通了就不难了. 能够转化为一个利用速度建立不等式.然后解不等式的问题. 建立速度,路程,时间的模型例如以下: /******** ...
- Windows 2008 R2 Server FTP使用问题
Windows 2008 R2 Server FTP必须在安装IIS的时候.安装IIS6.0兼职性. 否则建的FTP网站仅仅有关了防火墙才干使用. 原因未知.
- C# 中三个关键字params,Ref,out
一. using System; using System.Collection.Generic; using System.Text; namespace ParamsRefOut { class ...
- java 内存与内存溢出
学习自:http://www.codeceo.com/article/jvm-memory-overflow.html 讲的很清楚