搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
笔触狂放9
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
Android 9.0系统源码_SystemUI(一)SystemUI的启动流程_android systemui
2
面试官:简单聊聊MyBatis执行流程
3
ubuntu 15.10 mysql_升级到 Ubuntu 15.10后,MySQL Workbench 中断
4
星际争霸之小霸王之小蜜蜂(一)--窗口界面设计_星际争霸窗口模式
5
从0到1,入门到进阶玩转AI——Stable Diffusion超详细教程(二)_xxmix9realistic_v30.safetensors
6
Node.js基础---Express
7
麒麟操作系统nginx离线安装_麒麟系统离线安装nginx
8
html页面获取标签赋值,jq 赋值,取值
标签,以及html() 和text() 区别
9
【Java】花费数十小时,带你体验Java文档搜索引擎的实现过程_java搜索功能怎么实现流程
10
数据库numeric_TCGA数据库:生存分析
当前位置:
article
> 正文
点云三维重建--基于两视图的射影重构,仿射重构以及度量重构_两张图进行点云三维模型的搭建
作者:笔触狂放9 | 2024-02-21 10:02:59
赞
踩
两张图进行点云三维模型的搭建
一段时间以来一直对三维重建中的分层重建概念理解的比较模糊,这两天特地梳理了一下,用博文记录下来,也希望给各位观众朋友们带来帮助。
NO0.两视图重建
基于图片序列的三维重建不管在科研还是实际应用中都有了比较成功的实现,Bundler就是一个很不错的例子,随后的VisualSFM也已经得到了很好的应用,近两年发展较快的还有SLAM等,而基于两视图实现空间点的三维重建便是构造完整图片序列三维重建的第一步。本文侧重于简单归纳实现两视图重建的理论基础,由于我们通过
摄像机
采集的照片中往往存在不同程度的误差或者噪声,因此如果只是简单的采用下面涉及的几何原理进行重建,得到的结果会和我们的预期有较大的差别,在实际的算法实现中还需要引入更多的技巧和方法,这里为了让重建原理更加简洁清晰,所以没有深入到算法实现的细枝末节。
根据重建结果的精确程度,可以将两视图重建分成三层,分别是:射影重构,仿射重构,度量重构(和相似重构以及大部分书里讲的欧式重构其实就是一个概念)。图2-图4显示了利用图1中两张图像在不同方法下获得的重建结果。
图1.用于重建的两张图像
图2. 通过射影重构方法获得的重建效果
图3.利用仿射重构的方法获得的重建效果
图4.利用度量重构的方法获得的重建效果
从重建的结果我们可以直观的看出,射影重建的结果只反映出了真实场景中直线之间的相交性;仿射重建结果则进一步反映出了真实场景中存在的直线平行关系;度量重构又进一步反映出了直线之间的夹角关系,实际场景中两条直线之间的夹角为多少度,重建结果中就为多少度。由此我们可以知道,射影重构,仿射重构和度量重构组成了进行三维重构由低到高的三个层次。度量重构的结果是和场景的实际三维情况最为接近的,假如我们将场景的实际三维情况称为真实的
欧式
重构,那么度量重构和真实的欧式重构之间其实还相差一个相似变换(所以度量重构又被称之为相似重构),但是除了不能从模型中测量出场景真实尺寸以外,度量重构的结果已经能够满足我们的大部分需求。
有了对两视图重建三个层次的初步了解,下面我就来梳理一下要实现这三个层次的重建需要的条件有哪些,涉及到的重要概念和结论有哪些,以及重建的过程是怎样的。
**********************\0o. 华丽丽的分割线 .o0/***********************
在上述假设的基础上,下面分别对射影重构,仿射重构和度量重构进行分析。
NO1.射影重构
图5.进行射影重构的反向推导图
在实际的求解过程中,首先需要利用特征点提取和匹配算法获得两个视图的匹配点对,然后基于这些匹配点对求得和这两个视图相关的基本
矩阵
F,根据已有的结论,在获得基本矩阵F的情况下,摄像机矩阵可以选择为
,其中
是满足
的对极点。然后结合前面两个视图中的匹配点对求得他们对应的空间点三维坐标,这样就完成了三维点云的射影重构。
那么根据两个视图中的信息我们获得的重建结果是否就是唯一的呢?通过进行理论推导我们可以证实,这样的重建结果并不唯一。下面就分两种情况对这种重构的多义性进行分析:
上述理论推导对重建来说有两个重要的意义:
1.仅仅根据图像的对应便可以求出摄影重构,如果我们知道了一个摄影重构
2.如果进一步求出能够实现摄影重构和真正的欧式重构之间的非奇异
矩阵
H,那么我们便可以根据射影重构定理得到真实的欧式重构了!!!Perfect^O^.
摄影
重构的内容现在知道的大概就这些了,以后还会补充。下面进入到更高一层的重构----仿射重构。
NO2.仿射重构
因为该方法获得的重建结果再经过一个仿射变换便可以得到真实的欧式重建结果,所以我们称这种方法为仿射重建。从本文开始的实例中我们知道,仿射重建能够得到比射影重建更加符合实际场景三维信息的重建结果。仿射重建本身就是在摄影重建的基础上通过添加更多的约束条件实现的。这里添加的约束条件就是对无穷远平面的定位。因此我们可以认为仿射重建的本质就是采用某些方法定位无穷远平面。要定位一个平面,我们只要知道该平面上的三个点即可,而具体如何找到这样的三个点就是仿射重建的主要任务,方法有很多,下面会进一步解析。如果不出意外的话经过求解我们可以得到一个在射影空间中表示无穷远平面的四维矢量,这里用
来表示,而在真实的重构下
的坐标是
。所以只要找到使
映射到
的射影变换
,我们便大功告成,得到了真实的
欧式
重构,等等,情况好像并不是那么简单的,先驱们已经发现:一个固定无穷远平面的射影变换其实充其量就是一个仿射变换,因此这个重构和真实的重构还相差一个仿射变换,这种重构方法也就被称为仿射重构了。同时他们也揭开了这个
的神秘面纱,它就是:
,
接下来我们将变换
作用到所有点和两个
摄像机
上,那么便得到了仿射重建的结果。
现在思路已经很清晰了,接下来我们只要找到无穷远平面上3个点,进而求出了这个无穷远平面的方程,那么仿射重建也就水到渠成了,下面就重点记录下这些方法:
M1.采用平移运动实现仿射重构
根据常识,当一个人沿一条直线运动时,距离很远的物体(比如月亮)好像是固定不动的,图6就是一个很好的例子,两幅图像中的对极点在两幅图像中的像素点位置是一样的。因此从一对视角中我们可以很容易的找出这样的三个以上的点对(当然有些图像还是不行的),并且可以确定:投影形成这些点对的原始三维点肯定处于无穷远平面上,所以我们就确定了无穷远平面的方程。这个方法也可以不通过求解无穷远平面方程来进行重建的,因为我们将运动限制在了纯平移运动的范围内,所以两个视角之间的基本
矩阵
F就是一个反对称矩阵,这样就大大简化了我们的求解过程。在这种情形下有这样一个结论:
假设摄像机的运动是没有旋转且内参保持不变的一个纯平移运动,那么他的基本矩阵F就是一个反对称矩阵,
,并且作为仿射重构的两个摄像机矩阵可以是
。然后我们将这对摄像机
矩阵
作用到原来的点对上也就得到了三维点的坐标。但是这个方法在实际的数值计算中并不好实现,往往用的较多的是下面一种基于平行直线的方法。
图6.左右两张图像只包含了一个平移运动,两张图中的对极点在两张图像中的像素坐标是完全相同的
M2.利用场景中的平行直线
3D场景中平行直线的交点就是是位于无穷远平面上的,而这些直线被映射到图像上之后并往往不能保持平行,我们可以通过一些方法定位出他们的交点,这个点就是无穷远平面上一点在图像中投影形成的像。反过来将这个点用摄像机
矩阵
投影回去,便得到了一条和无穷远平面存在交点的射线。两个视角下的射线相交便得到了一个交点,且这个交点一定位于无穷远平面上。在图片上找到三组以上实际3D场景中的平行线,也就确定了三个无穷远点,无穷远平面也就确定下来了。
这个方法的重点就是找到消影点对,当我们找到图像A中的一组平行线的消影点以后,为了简化计算在B图像中只要找到这一组平行线中的一条,然后A图中的消影点在B图中对应的极线,求这两条直线的交点就好了。然后根据摄像机
矩阵
进行投影求交点,问题便迎刃而解了。:)这种方法也是最为常用的。
M3直线上的距离比
略
M4通过无穷单应矩阵求解
上述内容已经包括了进行射影重构的主要框架,但是在仿射重建中我们还发现了一个十分有用的无穷单应矩阵,下面主要讲述该矩阵的获取和用处。
无穷单应的作用就是将图像A中的一个点通过无穷远平面转移到两一张图像B上,代数表达就是:
,如果两个摄像机的
矩阵
分别是
,那么
,因此我们有了如下结论:如果一个仿射重构已经得到并且其中的摄像机矩阵是
,那么无穷单应
矩阵
就是
。无穷单应矩阵的关键作用在于:当已知无穷单应为H的时候,仿射重构的摄像机可以取为
。而H则可以通过三个消影点和F来计算(或者通过一条消影线与消影点对应和F来计算),具体计算方法还在学习中。。。
M5其中一个摄像机是仿射摄像机条件下的重建方法
仿射摄像机:是指摄像机矩阵的最后一行为(0,0,0,1)形式的摄像机,因为它将无穷远点映射为无穷远点(就是图像中找不到的意思吗?),所以把它叫做仿射摄像机。
如果一个摄像机是仿射摄像机,那么他的主平面就无穷远平面,而他的主平面就是仿射重构下相应摄像机
矩阵
的第三行,因此只要将摄像机矩阵第三行表示的平面映射到
,就可以得到仿射重构了。为了完成这个至关重要的平面映射我们需要做什么呢?其实我们要做的非常简单,保证一个前提,做到两个步骤。前提就是:两个摄像机矩阵形式必须是
,且P是一个仿射摄像机(其实任何一对规范的摄像机
都可以变换成P是仿射的摄像机对,具体怎么变换的还在研究中。。。)。步骤就是:1.交换两个
矩阵
的最后两列。2.交换每一个
的最后两个坐标,这样便得到了一个仿射重建。
事实上,真实的仿射
摄像机
是不存在的,我们只是为了方便而进行了一种近似,这种近似是有效的前提条件是:图像上看到的点的深度变化相对于它到摄像机的距离比较小。仿射重构的内容终于O-V-E-R了,下面进入到巅峰重建----度量重构,先喝口水。。。
NO3.度量重构
仿射重构的重点是找到无穷远平面,而度量重建则是在仿射重建的基础上找到绝对二次曲线,利用绝对二次曲线在仿射重构和真实的欧式重构之间的变换关系,将整个仿射重建的结果过提升为度量重构。绝对二次曲线在多个重构结果之间的方程是不变的(这里也说明了度量重构结果不是唯一的),因此它被称为绝对二次曲线。我们本来的目标是在仿射重构的基础上通过找到合适的
矩阵
,使得该绝对二次曲线映射为真实欧式空间中的绝对二次曲线。但是我们发现经过努力之后,得到的重建结果仍旧和真实的欧式重建有一定的差距,这个差距可以用一个相似变换来描述,但是这已经达到了度量重构的目的,重建结果也能够满足大部分的需求了。在这一步才开始用到了摄像机的标定矩阵。
现在问题再次归结为找到使仿射重建结果变换到度量重建结果的单应矩阵上来了,这个单应矩阵到底是怎样的,该怎么求得。已有的研究成果告诉我们,这个单应矩阵其实早就已经被发现了,所以我们就不用再做无用功了。我们有这样的结论:如果已知绝对二次曲线在某一幅图像中的像是
,且和这幅图像对应的仿射重构中的摄像机
矩阵
是
,那么就有这样一个
,他实现了由仿射重建到度量重建的一个飞跃。。。,形式如下:
,
其中的A由方程
经过Cholesky分解得到(是否意味着使用一对图像中的另一摄像机
矩阵
就会得到不一样的度量重构结果?因为两一张图像的摄像机矩阵肯定不同)。纵观上述式子我们发现只有其中的
是未知量,因此求取
的问题归结为求取
的问题,下面就来说说求取这个
有哪些方法:
M1.已知内参条件下的求解方法
如果相机的标定
矩阵
(也就是内参)K是已知的,那么绝对二次曲线在这张图像上的投影曲线方程为
,由此也可以看出一旦摄像机的内参确定了,那么绝对二次曲线在他所拍摄的图像中的方程也就确定了,不管外参怎么变化,这个方程式永远不变的。特殊情况1:当K的扭曲因子为0时(即s=0,对大多数标准摄像机来说,扭曲因子都是0,不是0的情况只发生在CCD阵列的像素元素产生扭曲使得x和y轴不垂直的情况下),
。特殊情况2:在1的基础上如果像素还是正方形的(即
),那么
。看起来这种方法是最实用的,而且特殊情况基本都符合实际情况,所以优先考虑这条思路。
M2.根据景物正交性约束的求解方法
景物正交直线的一对消影点(如图7所示)V1和V2就形成了对绝对二次曲线在这张图像中
投影
的一个约束
。类似的,来自一个方向的消影点V和与之垂直的平面消影直线l对
提供了另外的约束
(一个常用的例子就是垂直方向的消影点和水平地面平面的消影直线)。
图7.图中横的和竖的两组直线各有一个消影点
M3.同一
摄像机
在多幅图像中的约束
在多张图像中,因为摄像机没有变,所以绝对二次曲线的投影
在任何一个视图中都不会发生改变,再利用仿射重建中的无穷单应将其中一张图像中的
转换到另外一张图像上,
,这个方程会得到关于
的4个约束,而
有5个自由度,因此还需要额外的信息加入才能获得解。
M4.如果
已知,直接利用它求得度量重构
一条思路是根据
计算出两个摄像机的内参,然后利用本质
矩阵
和基本矩阵,内参之间的关系求得本质矩阵,然后利用本质矩阵恢复这相机矩阵,接着进行三维重建。
NO4.终极巅峰重构
这一部分所讲的是由射影重构结果直接升级为度量重构。
两种方法:下面分别介绍:
M1:在射影重构下空间点的集合为{
},这些点的对应坐标在射影重构下很容易通过计算获得。射影重构结果和实际的欧式重建结果可以通过一个单应
矩阵
联系起来:
(其中i=1,2,3......n)
每一组点对提供三个独立的线性方程,而H有15个自由度,因此需要5对以上(且没有四个控制点是共面的)的对应点就可以求出这个H。
M2:另一种方法是不经过计算
,而利用对真实的欧式空间中的点进行
投影
变换和图像中的点对应关系得到方程,从而得到解,方程形式如下:
一个对应点对产生两个方程,所以总共需要7对以上的对应点才能接出H,同时要注意如果是两张图像的一对对应点,则这一组点由于共面的关系,得到的4个方程中只有3个是线性无关的。这种方法和上一种方法相比的优势在于不需要欧式空间点
在两张图像中的对应点都被找到,而上一种方法则要求,不然没法求出射影重建下
的三维坐标。图8展示的是在射影重建下利用5个世界点坐标进行度量重建的实例。
图7.在射影重建下利用空间点的
欧式
物理坐标进行度量重建的步骤和结果
以上就是两视角重建相关的内容学习小结,各位亲爱的观众朋友们,如果你能够看到这句话才停下来,那你一定是一个非常伟大的人,感谢你宽广的胸怀接纳了我拙劣,对,就是拙劣的文笔和混论逻辑下的重建原理,我一定要向你表示敬意!!!如果发现文中有错误,请在下面直接回复给我,一定要毫不犹豫的做到^o^,我会尽快回复的。
NO5.俩视图重建方法小结
给定两幅未标定的图像,计算
摄像机
和景物结构的一个度量重构
可以通过以下的方法实现:
(1)计算射影重构
;
(a)由两幅图像之间的点对
计算基本
矩阵
(b)由基本矩阵计算摄像机矩阵
(c)根据匹配点对
,利用摄像机
矩阵
进行反投影得到空间点
坐标。
(2)有射影重构提升到度量重构
这一步有两种方法,要么根据在欧式空间中已知位置的5个点直接计算满足
的单应矩阵H,再将H作用到射影重构下的摄像机矩阵和空间点坐标上便得到了度量重构。要么再用分层的方法进行由两个步骤实现的重构:
(a)首先进行仿射重构,计算出无穷远平面
,然后用单应
矩阵
把射影重构提升到仿射重构。
(b)在进行度量重构,按照前面所述的方法找到绝对二次曲线的像
,然后用单应
对仿射重建结果进行提升。其中A由
经过
Cholesky分解得到,M是仿射重建中摄像机
矩阵
左边的3*3子矩阵。
Reference:
1.计算机视觉中的多视图几何,中文版第一版
2.Mastering OpenCV with practical Computer Vision Projects
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/笔触狂放9/article/detail/122827
推荐阅读
article
川核
元
宇宙
商圈
解决方案
|
打造
数字
消费
新
场景
,重塑
消费
元
宇宙
_
购物中心
打造
元
宇宙
场景
要投多少钱...
商业
元
宇宙
也为企业提供了创新的营销和品牌推广方式,通过与虚拟世界的互动来增强用户参与度和品牌认知度。_
购物中心
打造
元
宇宙
...
赞
踩
article
tensorflow2
.
x
自建
数据
集
训练
_
用
tensorflow2
.
x
训练
自己的分类
数据
集...
1.导入库import tensorflow as tffrom tensorflow import kerasfrom...
赞
踩
article
半导体技术
基础
_
摩尔
线程
和
登临
科技什么区别...
半导体技术
基础
AI的许多数据处理涉及矩阵乘法和加法。大量并行工作的GPU提供了一种廉价的方法,但缺点是更高的功率。具有内...
赞
踩
article
NO.48
------
C#实现
卡尔曼滤波
_
c#
卡尔曼滤波
...
通俗的讲,
卡尔曼滤波
就是综合上一步骤对当前步骤的预测值,结合当前步骤的测量值,来估计当前的状态。 最近在做一个Unity...
赞
踩
article
外星人
入侵
python
飞船
位置
_《
python
从入门到实践》项目一:
外星人
入侵
...
游戏编程思维导图游戏思路函数编写第一次做思维导图,做的有点乱解释:跟着《
python
编程从入门到实践》写完游戏程序后,写...
赞
踩
article
Python
中配合
遍历
语法
for
产生被
遍历
对象的函数
range
()_
pr
i
nt
(
s
[-
i
])...
选择题以下代码的输出结果是
s
= "
Python
"
for
i
i
n
range
(0,len(
s
),3):
pr
i
nt
(
s
[...
赞
踩
article
随笔:
MySQL
查询
事务
状态字
段
说明...
今天一个朋友想查看一下的
MySQL
层
事务
提交状态经历的过程,比如我们常说的prapare flush sync comm...
赞
踩
article
神经网络
介绍_做
分类
输出
层
节点数...
神经网络
是一种模拟动物
神经网络
的数学模型,可以对任意问题进行估计或拟合。它主要由输入
层
、隐藏
层
和
输出
层
组成。做
分类
输出
层
...
赞
踩
article
Unity
之
Json
解析_
unity
jsondata解析
int
数组...
Unity
解析
Json
数据json数据结构{ "JosnName":"按实际的号", "Size":25, "
int
Ar...
赞
踩
article
2020
java
并发
编程
面试题
及
答案
(最全版本持续更新)_
java
并发
编程
笔试题...
前言涵盖各大公司会问到的面试点,同时随着版本的升级,可能也会有一些
面试题
更新,也会同步保持更新,因为篇幅原因(其实是我懒...
赞
踩
article
mysql
innodb
_
undo
_
directory
默认
_
MySQL
innodb
_
undo
_
ta...
摘录自:http://gfsunny.blog.51cto.com/990565/1566683
undo
log(回滚)...
赞
踩
article
2022
-
07
-
06
Unity
核心9——3D
动画
_
unity3d
动画
...
使用导入的 3D
动画
:(一)状态设置相关参数 我们可以选中状态机窗口中的某一个状态为其设置相关参数,我们可以称之...
赞
踩
article
Unity
学习笔记(六)
2D
_
unity
使用
custom
outline
编辑器
...
Unity
文档中
2D
部分:精灵Sprite、瓦片地图Tilemap、
2D
刚体、
2D
碰撞体、
2D
材质、
2D
关节、
2D
效果器...
赞
踩
article
Linux
底层
基础知识
...
汇编,C语言,C++可以通过不同的编译器,编译成机器码。而java只能由Java虚拟机识别。Java虚拟机可以看成一个操...
赞
踩
article
python
中
的
range
()
函数
详解_
python
中
的
range
值...
start、stop、step 分别表示序列
的
起始值、终止值和步长。start 和 step 是可选参数,如果不指定则默...
赞
踩
article
Python
学习笔记(九)--游戏项目(4)_
from
pygame
.
sprite
import
s...
本节博客将为我们Pygame游戏项目《外星人入侵》添加外星人_
from
pygame
.
sprite
import
spr...
赞
踩
article
unity
菜单
滑动
插件_【
Unity3d
游戏
开发】
UGUI
插件入门之
游戏
菜单
...
ugui是
unity
4.6开始加入的一个新的ui系统,非常强大,下面我们将通过一系列博客的方式一起来学习一下ugui的使...
赞
踩
article
python
动画
精灵
_【
python
游戏编程之旅】第六篇---
pygame
中
的
Sprite
(
精灵
)模...
本系列博客介绍以
python
+
pygame
库进行小游戏
的
开发。有写
的
不对之处还望各位海涵。直到现在我们已经学了很多pyg...
赞
踩
article
Unity2D
入门手册_
filtermode
point
...
Unity2D
编辑裁切纹理图片素材导入2D模式下Texture Type导入默认为Sprite(2D and UI)裁...
赞
踩
article
使用
pytorch
搭建
神经网络
...
使用
pytorch
进行机器学习1. Config and Seed2. Transform/Pre-processing...
赞
踩
相关标签
人工智能
vr
python
pytorch
深度学习
c++
卡尔曼滤波
Unity
外星人入侵 python 飞船位置
开发语言
后端
数据库
神经网络
unity
json
mysql innodb_undo_directory默认
动画
3d
游戏引擎
学习
linux
运维
服务器