三维重建(3)--单视几何

news2024/11/16 17:43:24

目录

一、无穷远点、无穷远线、无穷远平面

1、2D平面上的无穷远问题

2、3D平面上的无穷远问题 

二、影消点与影消线

1、2D平面上的无穷远点,无穷远线变换

2、影消点

3、影消线

三、单视重构 

1、两平行线夹角与影消线关系

2、单视图标定


一、无穷远点、无穷远线、无穷远平面

        对于下面所有的坐标均用齐次坐标表述,而不是欧式坐标

1、2D平面上的无穷远问题

(1)2D平面上的线

        对于一条2D平面上的直线,我们可以用ax_1+bx_2+c=0 来表示,其中参数可以单独拿出来,作为一个整体,一个参数向量的形式(后续将沿用这种方法来表示一条线),即下面的\mathbf{\mathit{l}}=[a \hspace{0.25cm} b \hspace{0.25cm} c]^T,x作为直线上的一个点表示为x=[x_1,x_2,1]^T,这也满足了x^Tl=0,后续对于直线上的点与直线的关系均满足x^Tl=0条件。

(2)2D平面上线的交点

        定义两条直线叉乘得到的积,表示交点的坐标。如何证明2D平面上两条线的交点,交点与每一条直线间一定满足x^Tl=0关系,那么与点乘相同,可以证明一个被定义为x=l \times l'的点与两条直线分别垂直(点乘等于0),则他一定同时在两条线上,即相交。

(3) 2D平面上的无穷远点

        首先任意选取两条直线l,l',s.t.a/b=a'/b',即斜率相同两条线平行,那么若存在两条平行直线的交点x_\infty,则一定满足x_\infty =l \times l',且x_\infty \propto [b \hspace{0.15cm} -\hspace{0cm} a \hspace{0.25cm} 0]^T,我们也可以反过来证明两条直线的任意一条均穿过无穷远点,只需要满足l^Tx_\infty =0,对于2D平面上广义的无穷远点可以定义为x_\infty=[1,1,0]^T(后续无穷远点变换会用到)。

(4)2D平面上的无穷远线

        同一平面(在2D平面上均为同一平面)的无穷远点均位于同一无穷远线上,我们定义无穷远线为l_\infty=[0 \hspace{0.25cm} 0 \hspace{0.25cm} 1]^T,对于任意一个无穷远点一定满足最后一个齐次坐标x_3为0,所以对于任意一个2D平面下的无穷远点一定会在无穷远线上满足l_\infty ^Tx_\infty =0成立。

2、3D平面上的无穷远问题 

(1)3D空间中的面

        对于一个3D空间中的面可以定义为ax_1+bx_2+cx_3+d=0,同理可以将参数拆解为参数向量形式,定义参数表示的面\Pi = [a \hspace{0.25cm} b \hspace{0.25cm} c \hspace{0.25cm} d],对于一个面上的点x=[x_1,x_2,x_3,1] ^T,仍然有x^T \Pi =0 成立。

(2) 3D空间中的直线

        3D空间中的直线,一般很难去表示,可以用直线方向来粗略表示。

(3)3D空间中的无穷远点

        3D空间中的无穷远点,定义为x_4为0,其他三个坐标任意。此时必须保证同一平面上的平行线相交于同一无穷远点。

(4)3D空间中的无穷远线和无穷远面 

        对于平行平面会在无穷远处相交于同一条公共线,即无穷远直线,而若干条无穷远直线形成无穷远平面。定义无穷远平面为\Pi=[0,0,0,1]^T

二、影消点与影消线

1、2D平面上的无穷远点,无穷远线变换

(1)2D平面无穷远点变换

        变换主要考察投影变换和仿射变换,对于2D平面上点到点的变换就是乘以一个变换矩阵的映射关系,即p'=HpH表示变换矩阵,对于透视和仿射变换而言,仿射变换的无穷远点不变,透视变换的无穷远点不同。

点到点变换请参考:三维重建(2)--摄像机标定-CSDN博客

(2)2D平面线的变换 

        线的变换等价于任意点x在线l上,该点x进行变换得到x' ,变换后的点x'又一定在变换后的线l'上,所以通过式子的代换得到了线与线之间变换是乘以一个变换矩阵的转置的逆的映射关系,即l'=H^{-T}l

 (3)2D平面的无穷远线的变换

        根据线到线的变换关系,可以得到对于无穷远线经过仿射变换不变,透视变换会改变。

2、影消点

         影消点:三维空间中的无穷远点在图像中的投影点,在多视几何中,三维空间中两条平行线相交于无穷远点,而投影到二维空间的像平面坐标下就是一个有有意义坐标的点。

        一般我们定义三维空间的平行线方向为d=[a,b,c]^T,而三维空间中的无穷远点为x_\infty=[a,b,c,0]^T,假设像平面的影消点为v,那么一定有v=Kd成立,建立起影消点与无穷远点的关系(在不考虑摄像机外参数的情况下,即M=K)。此时d没有规定模长为1,所以进行规范化直线方向,得到d=\frac{K^{-1}v}{||K^{-1}v||}

3、影消线

        影消线:三维空间中的无穷远线在图像中的投影线,即影消线,由于摄像机经过一个透视变换将三维空间的坐标转换为二维坐标,那么可以利用线与线的变换关系,计算出影消线与无穷远线的关系l_{horiz}=H^{-T}l_\infty

        下图为三维空间下,同一平面的两条平行线在无穷远处相交,在像平面下形成的影消点,无数影消点形成影消线。

        另外可以得到影消线与平面法向量的关系,我们可以知道多个平行平面会聚在无穷远处得到无穷远线,无穷远线经过投影变换到像平面得到影消线,假设一个点P位于生成无穷远线的平行平面中的任意一个\Pi上的一点,记平面法向量为n,那么一定满足n^T P=0,另外该点经过投影变换一定在影消线上,满足l_h ^T(K[I \hspace{0.25cm} 0]P)=0成立,所以一定有n=K^Tl_h成立。

三、单视重构 

1、两平行线夹角与影消线关系

         注意是一共是四条线,两组平行线之间的夹角为θ,根据余弦定理可以得到夹角与两组平行线直线方向的关系,其中定义\omega=(K K^T)^{-1}

                                                cos\theta=\frac{d_1 \cdot d_2}{|d_1||d_2|}=\frac{v_1^T \omega v_2}{\sqrt{v_1^T \omega v_1} \sqrt{v_2^T \omega v_2}}

2、单视图标定

         由于K有5个自由度,而一般我们只能找到三组互相垂直的平行线,如下图这种典型的三个平面互相垂直,在三个平面上选择三组平行线,那么最多只能得到三个方程,而三个方程不能精确的解出五个未知数,所以一般我们规定零倾斜,正方形像素,此时内参矩阵中的θ=90°,α=β,此时只剩下三个未知数\alpha,c_x,c_y,理论上可以解出图像中的任意点,直线位置。

        接下来我们可以根据平面法向量和影消线之间的关系重构出世界坐标下的任何一个平面。

        但仍然存在弊端,我们无法还原出真实世界与重构场景之间的缩放比例大小,我们也不知道摄像机如何拍摄这张照片,场景的真实世界地理位置。

        如果我们无法确定出图片中的影消线和影消点,那么场景重构将无法完成,而一般图片中是缺少这些信息的。

Reference:https://www.bilibili.com/video/BV1xF411a7YQ/?spm_id_from=333.999.0.0

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

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

相关文章

Apifox 国产接口自动化利器 之入门篇

Apifox 产品介绍 Apifox 是集 API 文档、API 调试、API Mock、API 自动化测试多项实用功能为一体的 API 管理平台,定位为 Postman Swagger Mock JMeter。旨在通过一套系统、一份数据,解决多个工具之间的数据同步问题。只需在 Apifox 中定义 API 文档…

Java 全栈知识点问题汇总(上)

Java 全栈知识点问题汇总(上) 1 Java 基础 1.1 语法基础 面向对象特性?a a b 与 a b 的区别3*0.1 0.3 将会返回什么? true 还是 false?能在 Switch 中使用 String 吗?对equals()和hashCode()的理解?final、finalize 和 finally 的不同…

Win10 打开文件突然鼠标变成一个蓝色大圈卡住点不了也打不开文件,重启电脑也是这样

环境: Win10 专业版 加密客户端环境 问题描述: Win10 打开桌面word文件突然鼠标变成一个蓝色大圈卡住点不了也打不开文件,重启电脑也是这样,只有蓝色圈变大没有鼠标指针出现圈卡着不会动,和那些有鼠标箭头加小蓝色圈不一样 解决方案: 某网上查看的,还是要自己排查…

OceanBase集群扩缩容

​ OceanBase 数据库采用 Shared-Nothing 架构,各个节点之间完全对等,每个节点都有自己的 SQL 引擎、存储引擎、事务引擎,天然支持多租户,租户间资源、数据隔离,集群运行的最小资源单元是Unit,每个租户在每…

LeetCode、2300. 咒语和药水的成功对数【中等,排序+二分】

文章目录 前言LeetCode、2300. 咒语和药水的成功对数【中等,排序二分】题目及类型思路及代码 资料获取 前言 博主介绍:✌目前全网粉丝2W,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技术领域…

聚铭入选“2023中国数字安全能力图谱(精选版)”安全运营领域

近日,国内权威数字安全领域第三方调研机构数世咨询正式发布《2023年度中国数字安全能力图谱(精选版)》。聚铭网络作为国内领先的安全运营商,凭借在细分领域突出优势,成功入选该图谱“安全运营”领域代表厂商。 据悉&a…

python tkinter 最简洁的计算器按钮排列

代码如下,只要再加上按键绑定事件函数,计算器既可使用了。 import tkinter as tk from tkinter.ttk import Separator,Buttonif __name__ __main__:Buttons [[%,CE,C,←],[1/x,x,√x,],[7, 8, 9, x],[4, 5, 6, -],[1, 2, 3, ],[, 0, ., ]]root tk.T…

MyBatis 使用报错: Can‘t generate mapping method with primitive return type

文章目录 前言问题原因解决方案个人简介 前言 今天在新项目中使用 MyBatis 报如下错误:Cant generate mapping method with primitive return type 问题原因 发现是 Mapper 注解引入错误,错误引入 org.mapstruct.Mapper, 实际应该引入 org.apache.ibat…

FlinkAPI开发之状态管理

案例用到的测试数据请参考文章: Flink自定义Source模拟数据流 原文链接:https://blog.csdn.net/m0_52606060/article/details/135436048 Flink中的状态 概述 有状态的算子 状态的分类 托管状态(Managed State)和原始状态&…

如何实现 H5 秒开?

我在简历上写了精通 H5,结果面试官上来就问: 同学,你说你精通 H5 ,那你能不能说一下怎么实现 H5 秒 由于没怎么做过性能优化,我只能凭着印象,断断续续地罗列了几点: 网络优化:http2、…

JOSEF约瑟 双位置继电器UEG/C-4H4D AC220V 新款导轨安装 端子号可订做

系列型号: UEG/C-2H双稳态中间继电器;UEG/C-1H1D双稳态中间继电器; 双稳态中间继电器UEG/C-4H4D;UEG/C-3H1D双稳态中间继电器; UEG/C-2H2D双稳态中间继电器;UEG/C-4H双稳态中间继电器; UEG/…

HarmonyOS—开发环境诊断的功能

为了大家开发应用/服务的良好体验,DevEco Studio提供了开发环境诊断的功能,帮助大家识别开发环境是否完备。可以在欢迎界面单击Help > Diagnose Development Environment进行诊断。如果已经打开了工程开发界面,也可以在菜单栏单击Help >…

04 SpringBoot整合Druid/MyBatis/事务/AOP+打包项目

整合Druid 项目结构&#xff1a; 引入依赖&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaL…

【网站项目】331基于jsp的超市库存商品管理系统

&#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

【C语言深度剖析——第三节(关键字3)】《C语言深度解剖》+蛋哥分析+个人理解

本文由睡觉待开机原创&#xff0c;未经允许不得转载。 本内容在csdn网站首发 欢迎各位点赞—评论—收藏 如果存在不足之处请评论留言&#xff0c;共同进步&#xff01; 目录 1.基本数据类型2.sizeof关键字 前言&#xff1a; 本期我们继续探讨关于C深度解剖这本书相关内容&#…

AI智慧导诊系统(源码),利用人工智能技术,通过根据患者症状描述智能推荐挂号科室。

什么是智慧导诊系统? 简单地说&#xff0c;智慧导诊系统是一种利用人工智能技术&#xff0c;为医生提供帮助的系统。它可以通过分析患者的症状和病史为医生提供疾病诊断和治疗方案的建议。 智慧导诊系统可根据患者症状描述智能推荐挂号科室。系统采用对话式询问患者症状&…

C++初阶类与对象(二):详解构造函数和析构函数

上次为类与对象开了一个头&#xff1a;C初阶类与对象&#xff08;一&#xff09;&#xff1a;学习类与对象、访问限定符、封装、this指针 今天就来更进一步 文章目录 1.类的6个默认成员函数2.构造函数2.1引入和概念2.2构造函数特性2.2.1特性1~42.2.2注意2.2.3特性5~72.2.4注意 …

安装布隆过滤器

上传并解压文件解压文件 tar -zxvf RedisBloom-2.2.4.tar.gz 进入解压好的文件 make一下 返回进入conf 配置文件 loadmodule /usr/local/etc/redis/redisbloom.so 粘入 拷贝redisbloom.so到容器 : docker cp redisbloom.so redis:/usr/local/etc/redis 重启redis : docker …

如何编写一个好的测试用例?才能防止背黑锅

如何编写一个好的测试用例&#xff1f;才能防止背黑锅 什么是测试用例&#xff1f;一个好的测试用例包含什么&#xff1f;测试用例的编写思路总结 什么是测试用例&#xff1f; 在这之前&#xff0c;思考一个问题&#xff0c;下面这个简单的QQ登录页面&#xff0c;一共又多少条…

Sentinel 轨道数据及下载

Sentinel卫星轨道文件在处理Sentinel卫星数据时发挥着关键作用。这些轨道文件包含了有关卫星在轨道上的运动、位置、姿态等信息&#xff0c;对于地理校正、成像几何校正以及多时相分析等方面具有重要作用。以下是Sentinel卫星轨道文件的主要作用&#xff1a; 地理校正&#xff…