测试三角化,利用直接线性变换法求三维点坐标(三维重建task2-1)

本代码解决的问题:已知相机参数和匹配点,恢复三维点的坐标
这次代码最主要的内容就是:如何把矩阵用代码的形式表示。
然后最终获得:2.14598 -0.250569 6.92321的结果。
矩阵A的表达式如下:

 *           [x1P13 - P11]*       A = [y1P13 - P12]*           [x2P23 - P21]*           [y2P23 - P22]
std::vector<math::vec2f> points = { p1,p2 };std::vector<math::Matrix<double, 3, 4>>Projs = { P1,P2 };for (int i = 0;i<2;i++){//xipi3 - pi1math::Vec4d r1 = Projs[i].row(2)*static_cast<double>(point[i](0)) - Projs[i].row(0);for (int j = 0; j < 4; ++j){A(i * 2, j) = r1(j);}//yiPi3-Pi2math::Vec4d r2 = Projs[i].row(2)*static_cast<double>(point[i](1)) - Projs[i].row(1);for (int j = 0; j < 4; ++j){A(i * 2+1, j) = r2(j);}}

代码呈上

#include <math/matrix_svd.h>
#include "math/vector.h"
#include "math/matrix.h"int main(int argc, char* argv[])
{/* change*/math::Vec2f p1;p1[0] = 0.289986; p1[1] = -0.0355493;math::Vec2f p2;p2[0] = 0.316154; p2[1] =  0.0898488;math::Matrix<double, 3, 4> P1, P2;P1(0, 0) = 0.919653;    P1(0, 1)=-0.000621866; P1(0, 2)= -0.00124006; P1(0, 3) = 0.00255933;P1(1, 0) = 0.000609954; P1(1, 1)=0.919607    ; P1(1, 2)= -0.00957316; P1(1, 3) = 0.0540753;P1(2, 0) = 0.00135482;  P1(2, 1) =0.0104087  ; P1(2, 2)= 0.999949;    P1(2, 3) = -0.127624;P2(0, 0) = 0.920039;    P2(0, 1)=-0.0117214;  P2(0, 2) = 0.0144298;   P2(0, 3)   = 0.0749395;P2(1, 0) = 0.0118301;   P2(1, 1)=0.920129  ;  P2(1, 2) = -0.00678373; P2(1, 3) = 0.862711;P2(2, 0) = -0.0155846;  P2(2, 1) =0.00757181; P2(2, 2) = 0.999854 ;   P2(2, 3)   = -0.0887441;/* 构造A矩阵 */math::Matrix<double, 4, 4> A;//对A矩阵进行赋值std::vector<math::vec2f> points = { p1,p2 };std::vector<math::Matrix<double, 3, 4>>Projs = { P1,P2 };for (int i = 0;i<2;i++){//xipi3 - pi1math::Vec4d r1 = Projs[i].row(2)*static_cast<double>(point[i](0)) - Projs[i].row(0);for (int j = 0; j < 4; ++j){A(i * 2, j) = r1(j);}//yiPi3-Pi2math::Vec4d r2 = Projs[i].row(2)*static_cast<double>(point[i](1)) - Projs[i].row(1);for (int j = 0; j < 4; ++j){A(i * 2+1, j) = r2(j);}}math::Matrix<double, 4, 4> V;math::matrix_svd<double, 4, 4> (A, nullptr, nullptr, &V);math::Vec3f X;X[0] = V(0, 3)/V(3, 3);X[1] = V(1, 3)/V(3, 3);X[2] = V(2, 3)/V(3, 3);std::cout<<" trianglede point is :"<<X[0]<<" "<<X[1]<<" "<<X[2]<<std::endl;std::cout<<" the result should be "<<"2.14598 -0.250569 6.92321\n"<<std::endl;return 0;
}

解析

/* 实现线性三角化方法(Linear triangulation methods), 给定匹配点* 以及相机投影矩阵(至少2对),计算对应的三维点坐标。给定相机内外参矩阵时,* 图像上每个点实际上对应三维中一条射线,理想情况下,利用两条射线相交便可以* 得到三维点的坐标。但是实际中,由于计算或者检测误差,无法保证两条射线的* 相交性,因此需要建立新的数学模型(如最小二乘)进行求解。** 考虑两个视角的情况,假设空间中的三维点P的齐次坐标为X=[x,y,z,1]',对应地在* 两个视角的投影点分别为p1和p2,它们的图像坐标为*          x1=[x1, y1, 1]', x2=[x2, y2, 1]'.** 两幅图像对应的相机投影矩阵为P1, P2 (P1,P2维度是3x4),理想情况下*             x1=P1X, x2=P2X** 考虑第一个等式,在其两侧分别叉乘x1,可以得到*             x1 x (P1X) = 0** 将P1X表示成[P11X, P21X, P31X]',其中P11,P21,P31分别是投影矩阵P1的第* 1~3行,我们可以得到**          x1(P13X) - P11X     = 0*          y1(P13X) - P12X     = 0*          x1(P12X) - y1(P11X) = 0* 其中第三个方程可以由前两个通过线性变换得到,因此我们只考虑全两个方程。每一个* 视角可以提供两个约束,联合第二个视角的约束,我们可以得到**                   AX = 0,* 其中*           [x1P13 - P11]*       A = [y1P13 - P12]*           [x2P23 - P21]*           [y2P23 - P22]** 当视角个数多于2个的时候,可以采用最小二乘的方式进行求解,理论上,在不存在外点的* 情况下,视角越多估计的三维点坐标越准确。当存在外点(错误的匹配点)时,则通常采用* RANSAC的鲁棒估计方法进行求解。*/

测试三角化,利用直接线性变换法求三维点坐标(三维重建task2-1)相关推荐

  1. maple 解代数方程组得多项式_利用修正影射法求组合KdV方程新的精确解

    1引言非线性科学研究的一个重要方面就是讨论孤立子的性质.相互作用及其随时间运动演化的特点,因此非线性演化方程的求解越来越显得具有理论和实际意义.组合KdV方程是KdV和mKdV方程的复合,既包含有非线 ...

  2. Python数学基础:利用换元法求不定积分2

    Python数学基础:利用换元法求不定积分2 在高等数学中,不定积分是一个重要的概念,也是计算机科学和人工智能领域中常用的数学方法.本文将讲解如何使用Python编程语言来计算利用换元法求不定积分. ...

  3. 人工智能数学基础--不定积分2:利用换元法求不定积分

    一.引言 在<人工智能数学基础–不定积分1:概念与性质>介绍了必须熟记的十三个基本积分公式及十一个扩展公式,利用这些公式以及不定积分的加法以及数乘性质,可以进行部分积分的计算,但非常有限, ...

  4. 利用分洽法求一组数据中最大的两个数。

    #include <stdio.h> int max(int a[],int l,int r) {if(l==r){return a[l]; }int mid=(r+l)/2;int lm ...

  5. 利用参数模型估算法求工作量

    公式:Effort=a*KLOC^b*F 其中Effort为工作量(单位为人月),即开发成本.a,b查表所得,KLOC为千行代码,F为各成本驱动因子相乘所得(注:基本模型不考虑成本驱动.此处为中等模型 ...

  6. 三角化公式推导手撕代码

    前言 三角测量是在已知相机参数和图像中匹配点的情况下,求解这些匹配点对应的空间点三维坐标的方法.针对单目与双目系统,三角测量的使用方法有所不同.双目视觉测距原理参见:双目视觉测距原理深度剖析:一个被忽 ...

  7. 最小元素法求运输问题初始可行解

    实验内容:利用Matlab编程,利用最小元素法求运输问题的初始解. 产销地 B1 B2 B3 B4 产量 A1 2 9 10 7 9 A2 1 3 4 2 5 A3 8 4 2 5 7 销量 3 8 ...

  8. 利用熵值法确定指标权重---原理及Python实现

    背景 在进行一些综合评估类项目时,需要给一些指标确定一个合理的权重,用来计算综合得分,这种综合评估类项目在实际的业务中有很多应用,比如:学生奖学金评定方法.广告效果综合评估.电视节目满意度综合评估.用 ...

  9. 离散数学范式c语言实验报告,离散数学实验报告-利用真值表法求主析取范式及主合取范式的实现...

    1.实 验 报 告( / 学年 第 一 学期)课程名称离散数学实验名称利用真值表法求主析取范式及主合取范式的实现实验时间年月日指导单位指导教师学生姓名班级学号学院(系)专 业 实 验 报 告实验名称利 ...

最新文章

  1. 百度网络推广介绍网站在更换老域名时都需注意哪些?
  2. 大量的QT控件及示例发放
  3. 关于双等号判断的深入面试题
  4. 疯狂游戏型计算机配置清单,电脑配置清单
  5. javascript中Date对象的初始化方法
  6. 博客系统评论模块列表转树形结构
  7. 交钱赎“人”!B站500万粉UP主被黑客勒索,腾讯都表示无解
  8. PAT (Basic Level) Practise (中文)- 1002. 写出这个数 (20)
  9. linux mysql查看所有表_Linux之系统操作命令
  10. 慧荣SM2258XT-主板CE跳线Toggle土狗跳线合集整理(持续更新)
  11. python安装imageai库方法_小白对 imageAI环境搭建 实现object detection 的初使用(自己所用)...
  12. 【Java练习】图书管理系统【详解篇15+完整代码】
  13. 第三部分:成交动力学之十大成交激素——9、紧迫感
  14. 查询光猫厂家为ZTE,且内存范围在0到100之间,统计去掉重复的loid之后的数量,并计算出内存的avg,max,min,sum
  15. 主板声卡坏了会不会有电流声_不要小瞧十几块钱的USB声卡!
  16. 海信IP202H-晨星9385芯片-9.0-免拆卡刷固件包
  17. ReSharper配置及用法(转)
  18. 中国软件服务外包IT公司最新排名-IT外包最强前50名
  19. 联想a670t提示android,联想A670t线刷刷机教程
  20. 【zabbix监控三】zabbix之部署代理服务器

热门文章

  1. PCL 点读机,哪里不会查哪里!
  2. PHP 大神的十大优良习惯
  3. E. 一个新的斐波那契数列
  4. 【干货走一波】xxx平台JavaEE云计算大数据全套视频免费下载
  5. 长沙现象-老牌零售劲旅步步高的数据智能
  6. 计算机专业英语第12章在线测试答案,英语专业胡壮麟版本的语言学复习题(1-12章)...
  7. 【三星官方教程】如何为Gear VR开发应用(四):场景连接
  8. 首次申上青年基金的一些感悟(综合多位基金评审专家意见)【投稿作品展】
  9. 第十三届蓝桥杯(Web 应用开发)线上模拟赛
  10. 拓嘉辰丰电商:什么是拼多多上货助手?有什么作用?