【Triangulation】三角测量

【Triangulation】三角测量

      • 1. 三角测量定义
      • 2. 公式推导
      • 3. 代码实现中:

1. 三角测量定义

在三维重建中,三角测量(Triangulation)是一种基本的算法,用于利用两个摄像头从两个不同视角拍摄得到的图片中的匹配点来还原一个三维点的位置。具体方法是通过解线性方程组,找到最佳的三维点位置,使得该点在两个摄像机视角下的投影和实际观察到的二维点尽可能匹配。

2. 公式推导

这个 TriangulatePoint 函数接受两个矩阵(cam1_from_worldcam2_from_world,它们代表两个摄像机相对于世界坐标系的变换矩阵),以及两个二维向量(point1point2,它们表示在每个摄像机视角下观察到的点的坐标)。函数的目标是计算出全局坐标系中的三维点,该点在数学上应该映射到这两个二维点上。

为了进行三角化,我们利用摄像机投影矩阵的性质。一个点 P P P 在世界坐标系中的坐标可以通过摄像机的投影矩阵 C C C 转换为图像坐标系中的坐标 p p p ,这一过程可以用下面的等式表示:

p = C P p = CP p=CP

为了解这个方程,我们可以把它拆分为两部分,一部分对应 x x x 坐标,另一部分对应 y y y 坐标。对于二维点与三维点之间的对应关系,我们有:

x = ( c 11 X + c 12 Y + c 13 Z + c 14 ) / ( c 31 X + c 32 Y + c 33 Z + c 34 ) y = ( c 21 X + c 22 Y + c 23 Z + c 24 ) / ( c 31 X + c 32 Y + c 33 Z + c 34 ) \begin{align*} x &= (c_{11}X + c_{12}Y + c_{13}Z + c_{14}) / (c_{31}X + c_{32}Y + c_{33}Z + c_{34}) \\ y &= (c_{21}X + c_{22}Y + c_{23}Z + c_{24}) / (c_{31}X + c_{32}Y + c_{33}Z + c_{34}) \end{align*} xy=(c11X+c12Y+c13Z+c14)/(c31X+c32Y+c33Z+c34)=(c21X+c22Y+c23Z+c24)/(c31X+c32Y+c33Z+c34)

为了消除分母,我们可以将每个式子乘以分母的项,得到两个线性方程:

x ⋅ ( c 31 X + c 32 Y + c 33 Z + c 34 ) = c 11 X + c 12 Y + c 13 Z + c 14 y ⋅ ( c 31 X + c 32 Y + c 33 Z + c 34 ) = c 21 X + c 22 Y + c 23 Z + c 24 \begin{align*} x \cdot (c_{31}X + c_{32}Y + c_{33}Z + c_{34}) &= c_{11}X + c_{12}Y + c_{13}Z + c_{14} \\ y \cdot (c_{31}X + c_{32}Y + c_{33}Z + c_{34}) &= c_{21}X + c_{22}Y + c_{23}Z + c_{24} \end{align*} x(c31X+c32Y+c33Z+c34)y(c31X+c32Y+c33Z+c34)=c11X+c12Y+c13Z+c14=c21X+c22Y+c23Z+c24

当有两个摄像机和两个对应点时,我们可以将上面的方程组写为矩阵 A A A 的形式:

$$
Eigen::Vector3d TriangulatePoint(const Eigen::Matrix3x4d& cam1_from_world,
const Eigen::Matrix3x4d& cam2_from_world,
const Eigen::Vector2d& point1,
const Eigen::Vector2d& point2) {
Eigen::Matrix4d A;

A.row(0) = point1(0) * cam1_from_world.row(2) - cam1_from_world.row(0);
A.row(1) = point1(1) * cam1_from_world.row(2) - cam1_from_world.row(1);
A.row(2) = point2(0) * cam2_from_world.row(2) - cam2_from_world.row(0);
A.row(3) = point2(1) * cam2_from_world.row(2) - cam2_from_world.row(1);

Eigen::JacobiSVDEigen::Matrix4d svd(A, Eigen::ComputeFullV);

return svd.matrixV().col(3).hnormalized();
}
$$

3. 代码实现中:

A.row(0) = point1(0) * cam1_from_world.row(2) - cam1_from_world.row(0);
A.row(1) = point1(1) * cam1_from_world.row(2) - cam1_from_world.row(1);
A.row(2) = point2(0) * cam2_from_world.row(2) - cam2_from_world.row(0);
A.row(3) = point2(1) * cam2_from_world.row(2) - cam2_from_world.row(1);

这里的 point1(0)point1(1) 对应于上面方程中的 x x x y y ycam1_from_world.row(2) 是变换矩阵的第三行(我们称其为 c 3 i ( 1 ) c_{3i}^{(1)} c3i(1)),cam1_from_world.row(0)cam1_from_world.row(1) 分别对应变换矩阵的第一行和第二行(我们称其为 c 1 i ( 1 ) c_{1i}^{(1)} c1i(1) c 2 i ( 1 ) c_{2i}^{(1)} c2i(1))。对于第二个摄像机 cam2_from_world 也是同样的方法。

最后,通过计算 A A A 的奇异值分解(SVD)并且取 V V V 矩阵的最后一列,我们能够得到解空间的最小范数解。hnormalized() 函数是对坐标进行齐次归一化,从而得到三维空间中的点坐标。

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

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

相关文章

css-动画效果学习示例

阴影 x-轴 y-轴 模糊度 颜色 (正负值可以表示角度问题) 可以加多个阴影 内置阴影 transition 可以添加动画延迟效果 向z轴缩进,开启透视respective 触发旋转效果 学习来源 :动画属性_哔哩哔哩_bilibili

如何做标准化?| 京东云技术团队

在现代信息化的市场环境和社会中,标准化已经成为了各种行业的一个重要的标志。标准化不仅可以提升生产效率,减轻质量问题,还可以增加产品的可靠性和互通性。在这篇文章中,我们将探讨如何做标准化,为您提供详细的指导和…

深入Docker5:安装nginx部署完整项目

目录 准备 为什么要使用nginx mysql容器构建 1.删除容器 2.创建文件夹 3.上传配置文件 4.命令构建mysql容器 5.进入mysql容器,授予root所有权限 6.在mysql中用命令运行sql文件 7.创建指定数据库shop 8.执行指定的sql文件 nginx安装与部署 1.拉取镜像 2…

docker:Java通过nginx获取客户端的真实ip地址

问题现象 我们的平台使用Spring Cloud微服务架构,使用Spring Boot构建Java服务,使用google的jib插件打成docker镜像包我们使用docker虚拟化部署,使用docker-compose统一管理所有服务,包括Java服务和nginx等组件我们前后端分离&am…

游戏《泰坦陨落2》msvcr120.dll丢失的多种解决方法分享

在Windows 11操作系统环境下,众多玩家在体验《泰坦陨落2》这款备受瞩目的射击游戏时,遭遇了一个令人困扰的技术问题:系统提示缺失msvcr120.dll文件。这一关键的动态链接库文件对于游戏的正常运行至关重要,它的缺失直接导致了《泰坦…

如何用 ChatGPT生成生成元宇宙内容

ChatGPT 是一种强大的自然语言处理模型,可以生成高质量的文本内容,包括元宇宙相关内容。以下是一些建议,帮助您使用 ChatGPT 生成元宇宙相关内容: 明确需求:在开始生成内容之前,请明确您需要什么样的元宇宙…

ACEeditor使用手册(二)

文章目录 ACEeditor使用手册3. 代码高亮与语言支持3.1 语法高亮内置语言模式列表自定义语言模式动态切换语言模式 3.2 代码补全与提示启用代码补全功能自定义补全规则第三方补全库的集成 3.3 代码片段与模板插入代码片段自定义代码片段代码模板的使用 4. 编辑器配置与扩展4.1 编…

小白数学建模 Mathtype 7.7傻瓜式下载安装嵌入Word/WPS以及深度使用教程

数学建模Mathtype的下载安装嵌入Word/WPS以及深度使用教程 一 Mathtype 的下载安装1.1 安装前须知1.2 下载压缩包1.3 安装注册 二 嵌入Word/WPS2.1 嵌入Word2.1.1 加载项嵌入 Word2.1.2 宏录制嵌入 Word 2.2 嵌入 WPS2.2.1 加载项嵌入 WPS2.2.2 宏录制嵌入 WPS 2.3 嵌入时报错解…

【GNN报告】“青源Talk”-图可信学习与图大模型研究进展

北航王啸-图自监督学习 简介 介绍 浙大杨洋-探索大图模型预训练 总括 介绍 参考 Yang Yang - Zhejiang University dgraph-web DGraph: ALarge-Scale Financial Dataset for Graph Anomaly Detection All in One: Multi-task Prompting for Graph Neural Networks&#xf…

element-ui 打包流程源码解析(上)

目录 1,源码整体结构1.1,build 目录1.2,examples 目录1.3,packages 目录1.4,src 目录 2,打包整体流程2.1,npm run build:file2.1.1,build/bin/iconInit.js2.1.2,build/bi…

vue2 -- 截图工具html2canvas

文章目录 🍉需求描述🍉基础功能实现🍉下载另存为本地图片功能🍉需求描述 可以将网页中的指定元素或整个页面截取为图片,以便保存或分享。 🍉基础功能实现 在 Vue 中使用 html2canvas 实现 1:安装 html2canvas 库。你可以使用 npm 安装,命令如下: npm install …

K8S-YAML

一、Kubernetes对象的描述 kubernetes中资源可以使用YAML描述(如果您对YAML格式不了解,可以参考YAML语法),也可以使用JSON。其内容可以分为如下四个部分: typeMeta:对象类型的元信息,声明对象…

一款开源且不限制大小可以设置过期时间的支持分享的的开源文件共享系统picoshare 部署教程

1.拉取镜像 2.部署 创建目录 mkdir -p /opt/picoshare/data 部署 其中:"somesecretpass"是密码 docker run \--env "PORT4001" \--env "PS_SHARED_SECRETsomesecretpass" \--publish 10005:4001/tcp \--volume "/opt/picoshare/data:…

最优解-最长公共子序列

问题描述 最长公共子序列(Longest Common Subsequence,LCS)即求两个序列最长的公共子序列(可以不连续)。比如3 2 1 4 5和1 2 3 4 5两个序列,最长公共子序列为2 4 5 长度为3。解决这个问题必然要使用动态规划。既然要用到动态规划,就要知道状…

oracle11g的闪回技术-闪回表-时间戳

--数据库闪回表 --1创建表(登录模式system) CREATE table dept2 as select * from dept;--此语句如果加上where条件可用于工作中数据的临时备份 select * from dept2;--查询新建表信息 --进入sql>set time on 通过时间点闪回 记录弹出的时间点&#…

certificate-transparency-go用例

文章目录 证书的SCT列表验证SCT依赖包加载证书初始化log机构信息离线验证在线验证 证书的SCT列表 浏览器对证书链的合法性检查通过后,会再检查服务端证书附件里的SCT列表(Signed Certificate Timestamp); 浏览器内置了一批certif…

Tmux教程

会话(session)、窗口(window)、窗格(panel)的概念 参考资料:Tmux 使用教程 - 阮一峰的网络日志 (ruanyifeng.com) 命令行的典型使用方式是,打开一个终端窗口(terminal …

MySQL的安装和部署

2.0 描述 仅仅是一个产品,Oracle旗下的小型数据库。广泛应用在中小型项目中,特征体积小速度快整体成本低。尤其是开源,所以很多中小型项目为了降低成本纷纷选用MySql作为数控存储介质。 2.1 MySql的特征 底层语言使用C、C编写的。并且使用多…

Acrel-1000DP分布式光伏系统在某重工企业18MW分布式光伏中应用

摘 要:分布式光伏发电特指在用户场地附近建设,运行方式以用户侧自发自用、余电上网,且在配电系统平衡调节为特征的光伏发电设施,是一种新型的、具有广阔发展前景的发电和能源综合利用方式,它倡导就近发电,就…

一张图描述Http常用状态码(301、302、305、404、408等等)

301—永久移动。被请求的资源已被永久移动位置; 302—请求的资源现在临时从不同的 URI 响应请求; 305—使用代理。被请求的资源必须通过指定的代理才能被访问; 307—临时跳转。被请求的资源在临时从不同的URL响应请求; 40…