相机外参矩阵

news2024/9/20 16:42:33

在上一篇文章中,我们学习了如何将相机矩阵分解为内参矩阵和外参矩阵的乘积。在接下来的两篇文章中,我们将更详细地探讨外参矩阵和内参矩阵。首先,我们将探讨查看外参矩阵的各种方式,并在最后进行交互式演示。

SDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割 

1、外参相机矩阵

相机的外参矩阵描述了相机在世界中的位置以及它指向的方向。熟悉 OpenGL 的人知道这称为“视图矩阵”(或卷入“模型视图矩阵”)。它有两个组成部分:旋转矩阵 R 和平移向量 t,但我们很快就会看到,它们并不完全对应于相机的旋转和平移。首先,我们将检查外在矩阵的各个部分,然后我们将研究更直观的描述相机姿势的其他方法。

外参矩阵采用刚性变换矩阵的形式:左侧块中为 3x3 旋转矩阵,右侧为 3x1 平移列向量:

常见的是,此矩阵的底部会添加额外的一行 (0,0,0,1)。这使得矩阵变为正方形,这使我们能够进一步将此矩阵分解为旋转和平移:

这个矩阵描述了如何将世界坐标中的点转换为相机坐标。向量 t 可以解释为相机坐标中的世界原点位置,R 的列表示相机坐标中世界轴的方向。

关于外参矩阵,需要记住的重要一点是,它描述了世界相对于相机的变换方式。这通常是违反直觉的,因为我们通常希望指定相机相对于世界的变换方式。接下来,我们将研究两种更直观的描述相机外部参数的替代方法,以及如何将它们转换为外部矩阵的形式。

2、从相机姿势构建外参矩阵

直接指定相机的姿势通常比指定世界点应如何转换为相机坐标更自然。幸运的是,以这种方式构建外部相机矩阵很容易:只需构建一个描述相机姿势的刚性变换矩阵,然后取其逆。

令 C 为描述相机中心在世界坐标中的位置的列向量,令 Rc为描述相机相对于世界坐标轴的方向的旋转矩阵。描述相机姿势的变换矩阵为 [Rc|C]。像之前一样,我们通过添加额外的一行 (0,0,0,1) 使矩阵变为正方形。然后通过反转相机的姿势矩阵获得外部矩阵:

当应用逆矩阵时,我们利用旋转矩阵的逆矩阵是其转置矩阵这一事实,而平移矩阵的逆矩阵只是否定了平移向量。因此,我们看到外部矩阵参数与相机姿态之间的关系很简单:

有些文本用 -RC 代替 t 来编写外部矩阵,它混合了世界变换 (R) 和相机变换符号 (C)。

3、“注视”相机

熟悉 OpenGL 的读者可能更喜欢使用第三种方式指定相机的姿势,即 (a) 相机的位置、(b) 它所注视的对象和 (c)“向上”方向。

在旧版 OpenGL 中,这是通过 gluLookAt() 函数实现的,因此我们将其称为“注视”相机。让 C 为相机中心,p 为目标点,u 为向上方向。计算旋转矩阵的算法是(摘自 OpenGL 文档):

  • 计算 L = p - C。
  • 标准化 L。
  • 计算 s = L x u。(交叉乘积)
  • 标准化 s。
  • 计算 u' = s x L。

然后外部旋转矩阵由以下公式给出:

你可以像以前一样通过 t = -RC 获得平移向量。

4、试试看!

以下是参数化相机外部参数的三种不同方式的交互式演示。请注意,在三种参数化之间切换时,相机的移动方式不同。

这需要启用了 WebGL 并启用了 Javascript 的浏览器。

5、结束语

我们探索了三种参数化相机外部状态的方法。你喜欢使用哪种参数化取决于具体应用程序。

如果你正在编写 Wolfenstein 风格的 FPS,可能会喜欢以世界为中心的参数化,因为沿着 (t_z) 移动总是对应于向前行走。或者你可能正在通过场景中的路径点插入相机,在这种情况下,以相机为中心的参数化是首选,因为你可以直接指定相机的位置。如果不确定你喜欢哪种,请使用上面的工具并决定哪种方法感觉最自然。

下次我们探索内参矩阵,我们将了解为什么场景的隐藏部分永远无法通过缩放相机来显示。到时候见!


原文链接:相机外参矩阵 - BimAnt

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

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

相关文章

程序员必知必懂运维技术概念

引言 随着互联网和云计算的迅速发展,传统的单体架构逐渐被微服务架构所取代。这一变化带来了许多新的挑战,如环境一致性、应用的可移植性、服务的扩展性、服务间通信的管理以及安全性等。为了解决这些问题,业界开发了许多工具和技术&#xf…

SPSSAU | Adaboost模型原理及案例实操

AdaBoost(Adaptive Boosting)算法的核心思想是将多个弱分类器组合成一个强分类器。其算法步骤如下: 第一:初始化权重,为每个训练样本分配相等的初始权重; 第二:训练弱分类器,根据当…

如何做OLED屏幕安装方案

制定OLED屏幕安装方案时,需要综合考虑多个方面,包括安装环境、屏幕尺寸、支架选择、电源与信号连接、调试与测试等。以下是一个详细的OLED屏幕安装方案: 一、前期准备 确定安装位置: 根据使用需求和环境条件,选择一个…

基于FPGA的以太网设计(4)----详解PHY的使用(以YT8531为例)

目录 1、前言 2、如何了解PHY芯片? 2.1、总览 2.2、管脚 2.3、编码 2.4、自协商 2.5、环回模式 2.6、睡眠模式 2.7、复位 2.8、PHY地址 3、PHY芯片的寄存器配置 3.1、Basic Control Register (0x00) 3.2、Basic StatusRegister (0x01) 3.3、PHY Specific Status…

重生了,这一世 我一定要学会服务器 只因………

你好,我是Qiuner. 为帮助别人少走弯路和记录自己编程学习过程而写博客 这是我的 github https://github.com/Qiuner ⭐️ ​ gitee https://gitee.com/Qiuner 🌹 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 😄 (^ ~ ^) 想看更多 那就点个关注吧 我…

IT运维管理与ITSM:理论与实践

IT运维管理和IT服务管理(ITSM)在现代企业信息化过程中占据着举足轻重的地位。它们不仅是确保IT系统稳定运行和业务连续性的关键,还是推动企业数字化转型、提升竞争力的重要力量。本文将结合《IT运维管理和ITSM》文档的内容,深入探…

【C++/STL】:哈希的应用 -- 位图布隆过滤器

目录 🚀🚀前言一,位图1. 位图的概念2. STL库中的位图3. 位图的设计4. 位图的模拟实现5. 位图的优缺点6. 位图相关考察题⽬ 二,布隆过滤器1. 布隆过滤器的概念2. 布隆过滤器的实现3. 布隆过滤器删除问题4. 布隆过滤器的优缺点 点击…

江森自控引入电子签,“碳”索智能建筑数字未来

近年来,伴随着科技的不断进步和市场领域的持续延伸,智能建筑已然成为建筑业科技升级的必经之路。 作为智能建筑领域的全球领导者,江森自控始终走在数字化变革前列,并在业内率先引入了电子合同,通过全流程线上进行的签…

【办公类-53-03】2024年第一学期校历制作(“月/日(星期)”版、排班表、跳过节日和周三)

背景需求: 前期代码制作出2024年第一学期校历,按照5天一周的方法,提取实际工作日。制作成“周计划教案”使用的长日期、短日期 -【办公类-53--01】2024年第一学期校历制作(星火讯飞提取实际工作日,5天一行&#xff0…

Spring-Retry 框架实战经典重试场景

Spring-Retry框架是Spring自带的功能&#xff0c;具备间隔重试、包含异常、排除异常、控制重试频率等特点&#xff0c;是项目开发中很实用的一种框架。 1、引入依赖 坑点&#xff1a;需要引入AOP&#xff0c;否则会抛异常。 xml <!-- Spring-Retry --> <dependency&…

【AI大模型】通义千问:开启语言模型新篇章与Function Call技术的应用探索

文章目录 前言一、大语言模型1.大模型介绍2.大模型的发展历程3.大模型的分类a.按内容分类b.按应用分类 二、通义千问1.通义千问模型介绍a.通义千问模型介绍b.应用场景c.模型概览 2.对话a.对话的两种方式通义千问API的使用 b.单轮对话Vue页面代码&#xff1a;Django接口代码 c.多…

【C++】—— 类与对象(一)

【C】—— 类与对象&#xff08;一&#xff09; 1、类的定义1.1、类定义1.1.1、类定义格式1.1.2、成员变量的标识1.1.3、C 中的 s t r u c t struct struct1.1.4、C 中的内联函数1.1.5、总结 1.2、访问限定符1.3、类域 2、实例化2.1、实例化的概念2.2、对象大小2.2.1、对象的大…

【Hot100】LeetCode—1143. 最长公共子序列

目录 题目1- 思路2- 实现⭐最长公共子序列——题解思路 3- ACM 实现 题目 原题连接&#xff1a;1143. 最长公共子序列 1- 思路 模式识别1——> 求子序列问题 ——> dp数组定义为 i-1 和 j-1 动规五部曲 1- 创建dp数组 dp[i][j]&#xff0c;代表以 i-1 结尾的 text1 和…

“外挂”——逆向软件的分析与破解

本文来源无问社区&#xff0c;更多实战内容&#xff0c;渗透思路可前往查看http://www.wwlib.cn/index.php/artread/artid/11458.html#maodian1 前言&#xff1a; “外挂”的制作离不开软件的分析破解&#xff0c;这平时做ctf中的逆向题是有⼀定的差别的。最直观的区别体现在…

Leetcode 438. 找到字符串中所有字母异位词(java实现)

解题思路&#xff1a;滑动窗口。 异位词的典型解题方法就是用数组来统计出现的个数。本题也不例外。 直接上代码来进行讲解&#xff1a; public List<Integer> findAnagrams(String s, String p) {//初始化返回数组List<Integer> res new ArrayList<>();if …

百问网全志T113-PRO LVGL环境配置

运行LVGL示例 启动开发板 ​ 按要求接入电源或Type-c数据线&#xff0c;拨动拨码开关&#xff0c;将开发板上电 运行LVGL示例 ​ 打开串口终端软件&#xff0c;这里我使用MobaXterm软件演示&#xff0c;选择开发板的串口终端号&#xff0c;可以在设备管理中查看 这里我的串…

喜加一!望繁信科技再摘「2023年度新锐技术品牌奖」

1月31日&#xff0c;望繁信科技再次获颁由全球知名科技社区InfoQ评选的「2023年度新锐技术品牌奖」。这是InfoQ连续第二年将该奖项授予望繁信科技&#xff0c;用以肯定过去一年中&#xff0c;望繁信科技在流程挖掘与智能领域的技术创新与业务价值创造。 InfoQ在颁奖词中写到&…

【STM32】GPIO口以及EXTI外部中断

个人主页~ 有关结构体的知识在这~ 有关枚举的知识在这~ GPIO口以及EXTI外部中断 GPIO一、简介二、基本结构三、输入输出模式1、输入模式&#xff08;1&#xff09;上拉输入&#xff08;2&#xff09;下拉输入&#xff08;3&#xff09;浮空输入&#xff08;4&#xff09;模拟输…

【Python】面向对象的程序设计

一、面向对象的介绍 1.对象 对象是一种抽象概念&#xff0c;表示客观世界存在的实物&#xff0c;现实世界中能够看到的、触碰到的都可以成为对象&#xff0c;如&#xff1a;人、大象、小猫等。 对象通常分为两个部分&#xff0c;即静态部分和动态部分。静态部分为“属性”&a…

UE4 SLUA IOS打包报错解决办法

IOS打包报错&#xff1a;Fatal error "lua.h" file not found &#xff1a; SLua Unreal 在IOS远程打包编译的时候 Exteral没有copy过去&#xff0c;导致lua.h文件报错找不到&#xff0c;看了网上也没有写解决办法 错误信息截图&#xff1a; github上也有很多遇到改…