三角形法恢复空间点深度

三角形法恢复空间点深度

如下图,以图 I 1 I_1 I1为参考,图 I 2 I_2 I2的变换矩阵为 T T T。相机光心为 O 1 O_1 O1 O 2 O_2 O2。在图 I 1 I_1 I1中有特征点 p 1 p_1 p1,对应图 I 2 I_2 I2中有特征点 p 2 p_2 p2。理论上直线 O 1 p 1 O_1p_1 O1p1 O 2 p 2 O_2p_2 O2p2 在场景中会相交于一点 P P P,该点即是两个特征点所对应的地图点在三维场景中的位置。(由于噪声的影响,这两条直线往往无法相交)。简言之,在已知两个相机的相对位姿的情况下,得到在两个视图下的对应匹配点,即可求得该对应点在空间中的位置,也就是求得图像点的深度
参考链接1 、参考链接2 、论文链接
在这里插入图片描述

1.求解空间点坐标

当我们得到两个视图的一组匹配点,我们希望能恢复出世界点在三维世界的坐标。这里就涉及到使用三角形法来恢复点在3D空间的结构。一般比较常用的方法是线性三角形法(Linear triangulation methods )。线性三角形法使用直接线性变化(DLT)对点的世界坐标进行求解。
已知点对和和两个图像的投影矩阵和 ,根据相机投影模型,对应3D点满足 :
{ x 1 = P 1 X x 2 = P 2 X \begin{cases} \mathbf x_1 = P_1 \mathbf X \\ \mathbf x_2= P_2\mathbf X \end{cases} {x1=P1Xx2=P2X
这里 x 1 x_1 x1 x 2 x_2 x2是归一化后特征点坐标, X X X为三维空间点在世界坐标系的齐次坐标 X = [ x y z 1 ] T X=\begin{matrix} [x & y &z &1]^T \end{matrix} X=[xyz1]T使用DLT需要把式子改变成的形式。由于是齐次坐标的表示形式,使用叉乘消去齐次因子,有
{ x 1 × ( P 1 X ) = 0 x 2 × ( P 2 X ) = 0 \begin{cases} \mathbf x_1 \times (P_1 \mathbf X) = \mathbf 0 \\ \mathbf x_2 \times (P_2\mathbf X)=\mathbf 0 \end{cases} {x1×(P1X)=0x2×(P2X)=0
把和按照行展开代入,对第一幅图 I 1 I_1 I1
[ 0 − 1 y 1 1 0 − x 1 − y 1 x 1 0 ] [ P 1 1 T X P 1 2 T X P 1 3 T X ] = 0 \begin{bmatrix} 0 & -1 & y_1\\ 1 & 0 & -x_1\\ -y_1 & x_1 & 0 \end{bmatrix} \begin{bmatrix} P^{1T}_1X\\P^{2T}_1X\\P^{3T}_1X \end{bmatrix} = 0 01y110x1y1x10 P11TXP12TXP13TX =0

x 1 ( P 1 3 T X ) − ( P 1 1 T X ) = 0 y 1 ( P 1 3 T X ) − ( P 1 2 T X ) = 0 x 1 ( P 1 2 T X ) − y 1 ( P 1 1 T X ) = 0 \begin{split} x_1(P^{3T}_1X)-(P^{1T}_1X)=0\\ y_1(P^{3T}_1X)-(P^{2T}_1X)=0\\ x_1(P^{2T}_1X)-y_1(P^{1T}_1X)=0\\ \end{split} x1(P13TX)(P11TX)=0y1(P13TX)(P12TX)=0x1(P12TX)y1(P11TX)=0
由此可以得到三个方程,由于第三个方程可以由前两个方程得到(第三个方程可由前两个方程线性表示),因此只需要考虑前两个方程。每对匹配的特征( x 1 x_1 x1 x 2 x_2 x2)都会得到四个方程,表示为 A X = 0 AX =0 AX=0 的形式:
A = [ x 1 P 1 3 T − P 1 1 T y 1 P 1 3 T − P 1 2 T x 2 P 2 3 T − P 2 1 T y 2 P 2 3 T − P 2 2 T ] A =\begin{bmatrix} x_1P_1^{3T}-P^{1T}_1\\ y_1P_1^{3T}-P_1^{2T}\\ x_2P_2^{3T}-P_2^{1T}\\ y_2P_2^{3T}-P_2^{2T}\\ \end{bmatrix} A= x1P13TP11Ty1P13TP12Tx2P23TP21Ty2P23TP22T
由于是自由度为3的齐次方程,所以这是一个冗余的方程,这里相当于解一个线性最小二乘问题。方程的解为的最小奇异值对应的单位奇异矢量,解得,则最后令缩放使得的最后一项为1即可得到我们所求的3D点的坐标。
VINS-Mono 中的三角形法的实现代码如下:

/*** @description: DLT 三角形法恢复空间点深度* @date: 2024/06/20* @param[i]: Pose0: 第1帧 pose* @param[i]: Pose1: 第2帧 pose* @param[i]: point1: 第一帧 uv 坐标* @param[i]: point2: 第二帧 uv 坐标* @param[o]: point_3d: 三角化得到的三维坐标
**/
void GlobalSFM::triangulatePoint(Eigen::Matrix<double, 3, 4> &Pose0, Eigen::Matrix<double, 3, 4> &Pose1,Vector2d &point0, Vector2d &point1, Vector3d &point_3d)
{Matrix4d design_matrix = Matrix4d::Zero();design_matrix.row(0) = point0[0] * Pose0.row(2) - Pose0.row(0);design_matrix.row(1) = point0[1] * Pose0.row(2) - Pose0.row(1);design_matrix.row(2) = point1[0] * Pose1.row(2) - Pose1.row(0);design_matrix.row(3) = point1[1] * Pose1.row(2) - Pose1.row(1);Vector4d triangulated_point;triangulated_point =design_matrix.jacobiSvd(Eigen::ComputeFullV).matrixV().rightCols<1>();point_3d(0) = triangulated_point(0) / triangulated_point(3);point_3d(1) = triangulated_point(1) / triangulated_point(3);point_3d(2) = triangulated_point(2) / triangulated_point(3);
}

ORB-SLAM2中的三角形法的实现代码如下:

void Initializer::Triangulate(const cv::KeyPoint &kp1, const cv::KeyPoint &kp2, const cv::Mat &P1, const cv::Mat &P2, cv::Mat &x3D)
{cv::Mat A(4,4,CV_32F);A.row(0) = kp1.pt.x*P1.row(2)-P1.row(0);A.row(1) = kp1.pt.y*P1.row(2)-P1.row(1);A.row(2) = kp2.pt.x*P2.row(2)-P2.row(0);A.row(3) = kp2.pt.y*P2.row(2)-P2.row(1);cv::Mat u,w,vt;cv::SVD::compute(A,w,u,vt,cv::SVD::MODIFY_A| cv::SVD::FULL_UV);x3D = vt.row(3).t();x3D = x3D.rowRange(0,3)/x3D.at<float>(3);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/30817.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

战略网络优化:网络可观测性的综合方法

在网络成为运营支柱的时代&#xff0c;了解和优化网络性能至关重要。网络可观测性是了解网络性能的关键&#xff0c;它以一种全面、主动的方式超越了传统监控。本文说明了网络可观测性的变革力量&#xff0c;详细介绍了其优势、差异化因素及其在现代网络管理中的关键作用。 什…

vue学习(三)

14.监视属性watch 当被监视的属性发生变化时&#xff0c;回调函数立即调用&#xff0c;进行操作 监视的两种写法&#xff1a;直接配置或者通过vm添加 watch:{isHot:{immediate:true, //首次用到执行handler(newValue,oldValue){console.log("isHot 被修改了",newV…

python如何做报表系统

首先我们安装的python和PyQt5要保持一致&#xff0c;要么都是32位或者都是64位。 下载安装&#xff0c;安装完成之后我们记得要设置环境变量。 一路选择“下一步”就可以了。 安装完成之后我们需要验证是否成功。 pyqt5的安装直接安装就可以的&#xff0c;主要更改环境变量~~\p…

日语 11 12

11. 若者の意識 わかもの  いしき 新作 新作 新作 新作 新作 しんさく 公開 公開 公開 公開 公開 こうかい 映像 映像 映像 映像 映像 えいぞう 人気 人気 人気 人気 人気 にんき 来週 来週 来週 来週 来週 らいしゅう 外国 外国 外国 外国 外…

数据结构之B数

目录 1.概述 2.特点 3.诞生 4.优缺点 4.1.优点 4.2.缺点 5.应用场景 6.C语言中的B树实现例子 7.总结 1.概述 B树&#xff08;B-tree&#xff09;是一种自平衡的树数据结构&#xff0c;广泛应用于数据库和文件系统中&#xff0c;以便高效地进行顺序读取、写入以及查找…

桥式起重机司机精选试题(附答案)

1、【多选题】凡能引起可燃物质燃烧的热能称为着火源&#xff0c;着火源类型有:( )。( ABCD ) A、明火 B、电气火 C、雷电产生的火花 D、化学反应热 2、【多选题】制动器失效的主要原因是:( )。(BCD) A、制动带间隙过小 B、制动带磨损 C、弹簧失效 D、带上有油 3、【多…

vue3.0(十四)内置组件KeepAlive

文章目录 一、KeepAlive是什么1.KeepAlive的props属性2.KeepAlive的生命周期 二、使用场景三、源码四、缓存后如何获取数据 一、KeepAlive是什么 keep-alive是vue中的内置组件&#xff0c;能在组件切换过程中将状态保留在内存中&#xff0c;防止重复渲染DOM keep-alive 包裹动…

短剧app对接广告联盟流量变现开发 搭建

短剧APP对接广告联盟以实现流量变现的开发和搭建是一个综合性的过程&#xff0c;涉及多个关键步骤和要素。以下是一个大致的指南&#xff1a; 确定目标与定位&#xff1a; 明确短剧APP的目标受众是谁&#xff0c;以及其主要定位是什么&#xff0c;例如是提供原创短剧内容&#…

使用 C# 进行面向对象编程:第 9 部分

使用 OOP 的用户活动日志 应用程序背后的关键概念 在这一部分中&#xff0c;我们将使用之前学到的一些 OOP 概念。我们将创建一个小型应用程序。在继续之前&#xff0c;请阅读我的文章user-activity-log-using-C-Sharp-with-sql-server/。在本课程中&#xff0c;我们将再次使…

国内公开数据

以下是一些关于国内政府部门公布的数据或互联网上开放数据的资源&#xff0c;包括CSV、JSON和Parquet格式&#xff1a; 国内政府部门公开数据 中国政府数据开放平台 链接: 数据开放平台概要: 提供来自中国各级政府的公开数据集&#xff0c;数据格式包括CSV、JSON等。 上海市公…

2024年燃气企业负责人和安全管理人员考试题库。

31.使用&#xff08; &#xff09;进行液化天然气(LNG)的输送&#xff0c;对于卸、装车可以缩短卸、装车时间&#xff0c;提高输送效率。 A.低温泵 B.增压器 C.减压器 答案:A 32.液化天然气(LNG)用作调峰气源时&#xff0c;应注意与原燃气的&#xff08; &#xff09;&…

测试人员遇到需求变更 4大处理技巧

测试人员有效的需求变更管理&#xff0c;可以确保即使在需求频繁变化的情况下&#xff0c;测试工作仍然能够覆盖所有必要的功能点&#xff0c;从而保障最终产品的质量。如果没有合理的需求变更处理技巧&#xff0c;可能会造成不必要的返工和重复测试&#xff0c;无法维持项目的…

平安养老险浙江分公司开展防范非法集资宣传,守护群众“钱袋子”

为进一步提高群众对非法集资的防范意识的鉴别能力&#xff0c;近期&#xff0c;平安养老保险股份有限&#xff08;以下简称“平安养老险”&#xff09;浙江分公司以“守住钱袋子、护好幸福家”为宣传主题&#xff0c;深入居民社区、办公职场等公共场所开展的宣传活动。 平安养老…

排序题目:有序数组的平方

文章目录 题目标题和出处难度题目描述要求示例数据范围进阶 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;有序数组的平方 出处&#xff1a;977. 有序数组的平方 难度 2 级 题目描述 要求 给定按非递减顺序排序的整…

看完再买不后悔!希喂、小米、霍尼韦尔宠物空气净化器性价比比拼

在忙碌的工作之余&#xff0c;养一只猫真的能治愈一切的不快&#xff0c;让我们的心灵得到片刻的宁静。然而&#xff0c;这份宁静背后&#xff0c;却隐藏着一些不易察觉的烦恼——猫浮毛和异味。 猫浮毛&#xff0c;这个看似微不足道的小问题&#xff0c;实则给许多宠物主人带…

PS选不了颜色和路径描边?PS不知为何才能描边任意路径,这个办法让你秒懂

在选中路径的情况下&#xff0c;按图下操作&#xff0c;即可制作路径&#xff08;不会让你选不了颜色和路径描边&#xff09;

第4章 工程经济评价指标 作业

第4章 工程经济评价指标 作业 一单选题&#xff08;共27题&#xff0c;100分&#xff09; (单选题)利息备付率是指( )与应付利息费用的比值。 A. 息税前利润 B. 利润总额 C. 净利润 D. 营业收入 正确答案: A:息税前利润; (单选题)当净现值( )0时,该项目不可行。 A. < B. …

leetcode:557. 反转字符串中的单词 III(python3解法)

难度&#xff1a;简单 给定一个字符串 s &#xff0c;你需要反转字符串中每个单词的字符顺序&#xff0c;同时仍保留空格和单词的初始顺序。 示例 1&#xff1a; 输入&#xff1a;s "Lets take LeetCode contest" 输出&#xff1a;"steL ekat edoCteeL tsetnoc…

分布式光纤测温DTS使用的单模光纤与多模光纤有何区别?

分布式光纤测温DTS中使用的单模光纤和多模光纤之间存在着本质区别。单模光纤是一种在光纤通信中应用广泛的光纤类型&#xff0c;几乎所有的光纤入户和主干线通信都采用单模光纤。从通信的角度来看&#xff0c;单模光纤就好比一条单行道的高速铁路&#xff0c;而多模光纤则类似于…

Leetcode - 周赛401

目录 一&#xff0c;3178. 找出 K 秒后拿着球的孩子 二&#xff0c;3179. K 秒后第 N 个元素的值 三&#xff0c;3180. 执行操作可获得的最大总奖励 I 四&#xff0c;3181. 执行操作可获得的最大总奖励 II 一&#xff0c;3178. 找出 K 秒后拿着球的孩子 本题可以直接模拟&a…