2D模型和3D模型的配准与转化——概念
2D图像
目前,2D图像通常由2D相机拍摄,而大多数2D相机可以简化为基于镜头的成像系统,如图所示。

- 透视图。如上图
- 特写图。如果图像中没有检测到收敛点,或检测到多个收敛点,则该图像为特写图。
立体视觉
计算机立体(3D)视觉是从二维图像中提取三维信息的过程,是感知深度和三维形状的能力。类似于人类视觉的工作原理,我们大脑同时整合来自两只眼睛的图像,从而产生三维视觉。

对极几何
对极几何是立体视觉的几何学基础。3D点与它们在2D图像上的投影之间存在多种几何关系。
方向向量
在对极几何中,方向向量是从图像中的一个像素点发出的一个三维向量,这条线携带了所有可能成为图像中2D像素候选源的3D点:

场景中一个3D点的方向向量会在从不同视角拍摄的图像中投射出相应的2D点。因此,一对立体图像将会有从表示3D场景中共同的3D点的2D像素发出的方向向量。方向向量上的所有点都是候选源。由于两个向量只能在一个唯一的点上相交,我们将交点视为源点。

深度
当一个3D物体在图像中被捕捉(投影)时,它被投影到一个2D(平面)投影空间中。这种所谓的“平面投影”会导致深度丢失。
假设有左右两个摄像机,它们都产生了场景的二维图像。设S 为场景中一个真实世界(三维)物体上的一个点,为了确定生成的三维图像中S 的深度(深度一般是在连接两个相机的线上的垂直投影),我们首先在左右两个二维图像中找到与其对应的两个像素点L 和R 。我们可以假设我们知道两个摄像机的相对位置。计算系统使用相机之间的相对距离的先验知识,通过三角测量来估计深度d 。如下图:

估计每个点的深度,通过比较物体的相对深度得到深度图。
深度图是一种包含了从一个视点分离场景物体表面的数据的图像(或图像通道)

提示:假设相机之间的距离相对于物体和相机之间的距离非常小。
M
S
1
M_{S1}
MS1是两个相机的中点,
∠
S
1
M
S
1
R
S
1
∠S_1M_{S1}R_{S1}
∠S1MS1RS1接近90°,深度
d
S
1
d_{S1}
dS1接近
s
s
s。如下图:

视差图
两个立体图像之间的视差是物体的表观运动。如果我们闭上一只眼睛,然后迅速睁开,同时保持另一只眼睛闭着,我们会观察到靠近我们的物体移动得很多,而距离我们较远的物体几乎不动。我们将这种现象称为“视差”。
视差是左右图像之间一个点的投影的水平位移。要从一对立体图像创建视差图,我们首先必须将左图像中的每个像素与右图像中的相应像素进行匹配。我们计算每对匹配像素之间的距离。我们使用这些距离数据生成一幅称为视差图的强度图像。
要计算视差图,我们必须解决所谓的对应问题。这个任务旨在识别立体图像中的像素对,它们是空间中同一个实际物理点的投影。立体图像的校正可以大大简化这个问题。通过这种转换,匹配点将位于同一水平线上,将2D立体对应问题转化为1D问题。这就是我们打破“维度诅咒”的方式。
块匹配算法是识别相关像素的基本方法。该算法的基础是在第一幅图像中围绕一个点的一个小窗口与第二幅图像中沿着单条水平线排列的几个小块之间的比较。用于窗口匹配的两个主要相似度度量是绝对差值之和(SAD)和平方差之和(SSD)。
视差与深度呈反比关系。
3D模型
三维数据的表现形式一般分为四种,分别是点云、网格、体素与多视图。
- 点云是三维空间中点的集合;由N个D维的点组成,当D=3则可表示为三维坐标点(x,y,z) ,当D>3时,可以为(x,y,z)点指定其它的属性(颜色、强度等)。
- 网格由三角面片和正方形面片组成,其来源于多边形网格。多边形网格由一组带公共顶点的凸多边形表面组成,可近似一个几何表面。
- 体素从点云发展而来,由三维栅格物体用0和1表征。体素就好比三维空间中的像素点,我们可以把体素网格看作量化的、大小固定的点云。
- 多视图表示是从不同的模拟视角(虚拟摄像头)获取到的渲染后的多边形网格二维图像集合,从而通过一种简单的方式表现三维几何结构。

3D点云(3D point cloud)
概念
三维计算机视觉应用正在从以二维图像推断3D信息(“深度”和“立体”)转向直接在3D点云数据上进行工作的计算机视觉系统
在查阅资料的过程中,看到了这一句话,说明了现在三维计算机视觉应用的发展趋势。3D点云数据是什么?就像学习2D图像的卷积一样,我们应该先知道3D图像是怎么在计算机中存储的。
点云(英语:point cloud)是空间中点的数据集,可以表示三维形状或对象,通常由三维扫描仪获取。点云中每个点的位置都由一组笛卡尔坐标(X,Y,Z)描述,有些可能含有色彩信息(R,G,B)或物体反射面强度(英语:Intensity)信息。强度信息的获取是激光扫描仪接受设备采集到的回波强度,此强度信息与目标的表面材质、粗糙度、入射角方向,以及仪器的发射能量,激光波长有关。点云也是逆向工程中通过仪器测量外表的点数据集合。
- 位置信息:“将物体用点表示出来,所形成的一团一团的点,像云一样,就被叫做点云。”如下图:

- 色彩信息:给点云着色
- 强度信息:根据不同的物体表面,激光返回的强度值也不同(三维激光扫描是主动光源,不需要外界照明也可以工作),效果图如下:

- 点云是三维的、可以转动视角的。当观察点云的摄像机视角离点云较远时,点之间的距离变小,看上去似乎是一个面。
误区——理解"点云"和"模型"
当我们说一个“模型”的时候,这个模型是可以选中的,比如说一个桌子的模型,点击桌腿,是可以选中整个桌子模型的,模型中包含骨架线、贴图等等内容。
而在点云里没有“体”的概念,点云上的点全部都是离散点,即点与点之间没有逻辑关系,每一个点记录的都是它自身的坐标位置。点云不带任何上述的信息,只是包含很多个带有坐标的点形成的云,观察起来比较像模型。
存储
- ASCII码
使用文本来传达信息。ASCII 点云中的每一行文本代表 X、Y、Z 空间坐标。常见的扩展名:XYZ、OBJ、ASC、PTX。 - 二进制
以二进制代码保留所有信息。尽管二进制数据更难访问和解释,但文件本身比 ASCII 文件小得多。常见的二进制扩展:LAS、PCD、FLS。 - 3D模型
将点云转换成3D模型的过程称为“表面重建”。
① CAD模型:允许修改3D扫描数据(应用于逆向工程等)
② NURBS曲面模型:将3D扫描数据转换为具有曲面的3D对象(应用于屏幕可视化、视频游戏渲染等)
③ 网格:将3D扫描数据变成多边形或三角形网格(应用于3D打印等)
主要特点
- 旋转不变性
旋转不变性是指点云数据在三维空间中的平移旋转不会改变点云数据本身的性质,平移和旋转之后表示的仍然是同一物体。这个特点对于点云数据的处理和分析非常重要,因为在实际应用中,我们很难保证获取到的点云数据的方向和位置是固定不变的,旋转不变性保证了平移旋转不会影响点云的特征提取和识别。为了实现旋转不变性,通常会使用旋转不变特征来描述点云数据,如法向量、曲率等。 - 置换不变性
置换不变性是指点云数据在点的排列顺序上的变换不影响其描述的物体的形状和特征。也就是说,如果我们对点云数据中的点进行任意排列,得到的点云数据仍然能够描述同一个物体。这个特点在点云数据的处理和分析中也非常重要,因为不同的点云数据可能有不同的点的排列顺序,但它们应该能够描述同一个物体。
为了实现置换不变性,通常会使用基于点的局部坐标系的描述方法,如基于旋转的局部参考系(RF)等。这些方法可以将点云数据中的每个点转换到一个局部坐标系中,从而使得点的排列顺序不再影响点云数据的描述。
三维深度学习技术
回到“三维计算机视觉应用正在从以二维图像推断3D信息(“深度”和“立体”)转向直接在3D点云数据上进行工作的计算机视觉系统”,如何直接在3D点云数据上进行工作?如何以二维图像推断3D信息?需要了解二者的原理和区别。
在点云数据上进行工作
关于三维数据的深度学习应用于:三维形状分类、三维目标检测与跟踪、三维点云分割、三维点云配准等,六自由度姿态估计和三维重建。

按照表现形式,可分为三种:
-
基于多视图的方法。将非结构化点云投影到多个二维图像视图中,然后提取视图的特征,融合这些特征以进行准确的……

-
基于体积(离散化)的方法。体素网格缩小了二维和三维之间的差距,将点云转换为三维体积表示,然后利用成熟的二维或三维卷积网络实现……

体素的缺点是:需要很高的分辨率才能模拟出一个物体的精准结构。而高分辨率往往意味着大量的内存和计算量。这类方法难以处理密集的3D数据,因为计算量随着分辨率三次方增长。 -
基于点的方法。直接在原始点云上工作,而不需要任何体素化或投影。独立地学习每个点的特征、从每个点的领域中捕获精细的几何结构。
由于点云的不规则性,三维点云的卷积核很难设计。根据卷积核的类型,目前的三维卷积方法可分为连续卷积法和离散卷积法。

二维图像推断3D信息
根据上述概念,显然我们拍摄的2d图像不存储深度信息,只存储颜色信息。我们使用立体匹配算法得到视差图,通过使用相机的几何配置作为输入,将视差图进行三角测量,将其转换为深度图。得到深度图之后,就相当于我们得到了三维坐标,接下来可以通过深度图生成点云、重建世界坐标等,具体接下来需要进行什么操作没有办法一概而论。
- 视差图转换为深度图
视差图→深度图公式: D = B F d + ( x 0 r − x 0 l ) D = \frac {BF} {d+(x_{0r} - x_{0l})} D=d+(x0r−x0l)BF
其中 D D D为深度, d d d为视差, B B B为基线长度, f f f为焦距(像素单位), x 0 r x_{0r} x0r和 x 0 l x_{0l} x0l分别为右、左视图主点的列坐标。 - 深度图计算相机坐标系下的点云
深度图→点云公式: { Z = D X = D ( x − x 0 l ) f Y = D ( y − y 0 l ) f \left\{\begin{array}{l} Z = D\\ X = \frac{D(x - x_{0l})}{f}\\ Y = \frac{D(y - y_{0l})}{f}\\ \end{array}\right. ⎩ ⎨ ⎧Z=DX=fD(x−x0l)Y=fD(y−y0l) - 重建世界坐标
找到从摄像机指向该点的方向向量(需要是单位向量),将该方向向量乘上深度值就能得到摄像机指向该点的向量,将该向量加上摄像机位置就能得到该点的世界坐标。
2D模型和3D模型的配准与转化——配准
点云配准
点云配准也称为点集配准或扫描匹配,这是指一个点云与代表同一物理对象的另一个点云(或 3D 模型)对齐。
配准有几个不同的目的:
- 合并来自单独扫描的两个或多个数据点以创建更准确的数据集,例如使用两种不同的扫描技术捕获单个对象时
- 质量控制(记录差异),例如将制造的零件通过 3D 扫描获得的点云与零件原始 CAD 模型的点云进行比较,这可以显示制造的零件是否忠实于 CAD 模型,或者制造过程是否产生了缺陷。
2D模型和3D模型的配准与转化——转化
3D模型→2D模型
流程总览

在图形学的运行管线中,会经历模型变换(Model Transformation)到视图变换(View Transformation)最后再到投影变换(Projection Transformation)的过程。
- 模型变换:将所有需要渲染到屏幕上的模型放在一个场景内。一群人合照,大家在选择位置站好的过程就是模型变换。
- 视图变换:将原本世界空间坐标下的物体转换到视图空间。摄像机选择角度和位置的过程就是视图变换。
- 投影变换:最后按下快门选择拍照的过程。
模型变换(Modeling Transformation)
模型变换的部分主要负责的就是将模型从局部坐标系转到世界坐标系下的过程。 因为每个模型都有自己的局部坐标系,所以在对于不同的模型进行移动的时候,将所有模型转化到一个坐标系下,进行的各种仿射变换会比较容易。

具体的变换过程是在总体上对于原本的模型空间的坐标乘以一个变换矩阵,从而使其转化为世界空间下的坐标。

而这里的模型矩阵又可以被拆分成为具体的缩放旋转平移三部分的矩阵。

要注意旋转和平移矩阵的关系,一定是对于原模型空间下的坐标执行旋转矩阵变换,再执行平移矩阵变换,具体原因是由于旋转矩阵的旋转角度都是默认当前坐标系下的原点和坐标轴进行旋转,如果先进行平移操作,则会改变坐标系的位置,从而使得出现不一致。

视图变换(View Transformation)
在将所有模型变换到世界空间下后,我们得到了不同模型的不同坐标。但是此时我们还没有这些模型在摄像机空间下的相对坐标,从而不能确定哪些物体是可以被看到和渲染出来。而视图变换则进行了这部分操作。
step1 确定摄像机
- 确定摄像机的位置
摄像机在世界空间内处于什么位置,直接决定了观察者的距离模型物体的远近等。 - 确定视角方向
Look-at direction 也被称作Gaze direction,就是观察方向的问题。(可以理解为水平方向的旋转角度) - 确定相机的垂直向上分量
Up direction,通过确定这一变量,可以完全确定一个摄像机,因为如果只有前面两个分量,无法确定摄像机的转向,例如正向、上下颠倒、倾斜等。(可以理解为垂直方向的旋转角度)
step2 构建坐标系
以摄像机作为原点,构建坐标系,将世界空间下的模型坐标转换到视图空间(View Space),记录物体与摄像机之间的相对变换。
假如摄像机和物体同时经过相同的变换,最后的成像将完全相同,所以我们只需要记录模型与摄像机的相对位置,就可以得到最后的成像效果。
在图形学中,我们习惯将相机的位置摆放在坐标原点,同时视角方向朝向-Z方向,而相机的向上方向则为Y方向,构成一个右手坐标系。
具体步骤如下:
- 规定相机初始坐标 e e e、对向方向 g g g、向上方向 t t t。
- 利用平移矩阵 T V i e w T_{View} TView将相机位置平移到世界坐标原点位置 P o r i g i n = T V i e w ⋅ e P_{origin} = T_{View}·e Porigin=TView⋅e。
- 利用旋转矩阵 R V i e w R_{View} RView将 g g g旋转到-Z方向,将 t t t旋转到Y方向,将 g × t g×t g×t旋转到X方向。
则
M
V
i
e
w
=
R
V
i
e
w
×
T
V
i
e
w
M_{View}=R_{View}×T_{View}
MView=RView×TView,其中平移矩阵和旋转矩阵为:


投影变换(Projection Transformation)
投影变换是将三维坐标下的点,经过矩阵变换,投射到2D坐标空间的过程。
投影变换分为两种:正交投影变换和透视投影变换。

正交投影变换和透视投影变换主要区别是视锥体形状的不同。视锥体指的是摄像机在场景中的一个可见范围,可以用一个虚拟的锥体将整个可见范围包裹起来,而在视锥体之外的物体将无法被摄像机看到,从而进行剔除操作。而视锥体由六个面组成,分别为上、下平面,左、右平面,以及近裁剪平面(Near Clipping Plane)和远裁剪平面(Far Clipping Plane)。正交投影和透视投影的视锥体效果分别如下:


正交投影变换(Orthographic Projection)
- step1 平移:将所有的可视模型物体用一个虚拟长方体包裹

- step2 旋转:将该长方体转换到一个取值范围为
[
−
1
,
1
]
3
[-1, 1]^{3}
[−1,1]3的
2
×
2
×
2
2×2×2
2×2×2立方体内

其中,缩放、平移变换矩阵为:

我的理解(猜测):
每一个物体M,对于其上的某一个像素块,都有两个信息,一个是位置信息,一个是颜色信息,我们可以把它俩拆开存储,即不直接存储为高维度的数组,而是用两个指标表示。其中颜色信息是一个长度为3的一维向量,例如[94, 18, 117],分别对应rgb三个通道;位置信息是一个长度为4的列向量
[
x
,
y
,
z
,
1
]
T
[x, y, z, 1]^{T}
[x,y,z,1]T,分别表示像素块在空间中的x、y、z坐标,用1表示空间中的这个像素点是否是一个真实的物体(也有可能仅仅是为了便于计算而引入的向量,因为平移的时候要用原位置减去平移距离)。
透视投影变换(Perspective Projection)
透视投影变换更加广泛的应用于我们实际生活中的大部分情况,比较符合我们实际的观察情况。透视投影主要满足的就是“近大远小”的规则,同时原本在欧氏几何中的平行线,在透视投影情况下也不再平行,而是会在某一个点相交。
举个例子,假如把手指头放在眼睛前,看远处的门。正交投影变换中,物体的宽高都是等比例的,即可以把问题转换为“把手指头贴在门上”,以远平面为尺度来设计“正方体盒子”,开了上帝视角。透视投影变换中,物体的宽高是以你的眼睛为比例的,即可以把问题转换为“手指头似乎比门还要大”,以近平面为尺度设计“正方体盒子”,开第一人称视角。所以我们要获得透视投影,不能只根据实际物体的大小来进行计算,而是要先将远处大的物体缩小到近平面的尺度上去,将实际空间的棱台视锥体转换为立方体,如图所示:

- step1:将视锥体的远裁剪平面缩小到和近裁剪平面一样的大小,其中,远裁剪平面有规定:
① 变换后的远裁剪平面的Z坐标保持不变,即这个远裁剪平面不会向前或向后移动
② 变换后的远裁剪平面中心点坐标仍然保持不变
③ 近裁剪平面永远保持不变 - step2: 将改变后的长方体 按照正交投影进行变换到对应的立方体内
具体计算方式如下,以某一直线
x
=
x
i
x=x_i
x=xi的横截面为例(如下图),已知相机到近裁剪平面的距离n,根据相似三角形的定义,可以得到z裁剪平面变换后的坐标
(
x
′
,
y
′
,
z
′
)
=
(
n
z
∗
x
,
n
z
∗
y
,
?
)
(x', y', z') = (\frac{n}{z}*x, \frac{n}{z}*y, ?)
(x′,y′,z′)=(zn∗x,zn∗y,?),其中
z
′
=
z
z'=z
z′=z只有在近平面和远平面时才恒成立,因此
z
′
z'
z′暂时无法表示。(我理解为,我们在透视投影变换的时候,近平面和远平面的点z值不变,但是由于视锥体的特殊性,将空间中的物体转化成正交投影时,物体会在z的方向上有不同程度的拉伸)

通过分母同乘z将该坐标拓展为齐次坐标:
(
n
x
,
n
y
,
?
,
z
)
(nx, ny, ?, z)
(nx,ny,?,z),我们依据这个齐次坐标变换,可以得到变换矩阵的一部分,即
(
n
x
,
n
y
,
?
,
z
)
T
=
(
n
0
0
0
0
n
0
0
?
?
?
?
0
0
1
0
)
(
x
,
y
,
z
,
1
)
T
(nx, ny, ?, z)^T = \left( \begin{array}{} n&0&0&0\\ 0&n&0&0\\ ?&?&?&?\\ 0&0&1&0 \end{array} \right) (x, y, z, 1)^T
(nx,ny,?,z)T=
n0?00n?000?100?0
(x,y,z,1)T
齐次坐标就是将一个原本是n维的向量用一个n+1维向量来表示,是指一个用于投影几何里的坐标系统,如同用于欧氏几何里的笛卡儿坐标一般。
变换矩阵 M p e r s p → o r t h o = ( n 0 0 0 0 n 0 0 ? ? ? ? 0 0 1 0 ) M_{persp→ortho} = \left( \begin{array}{} n&0&0&0\\ 0&n&0&0\\ ?&?&?&?\\ 0&0&1&0 \end{array} \right) Mpersp→ortho= n0?00n?000?100?0 [ 注意:变换矩阵应用于投影视图的所有点,不止是远平面,变换矩阵第三行必须要用该空间的一个常数,以适用于空间内任意z值的点 ]。
设第三行为 ( a , b , c , d ) (a, b, c, d) (a,b,c,d),已知近平面上的点 ( x , y , z , 1 ) (x, y, z, 1) (x,y,z,1)变换后位置不变,仍为 ( x , y , z , 1 ) (x, y, z, 1) (x,y,z,1),且 z = n z = n z=n,为了和上述齐次坐标对应,也同乘z(此时z=n),则有 ( n x , n y , n 2 , n ) T = ( n 0 0 0 0 n 0 0 a b c d 0 0 1 0 ) ( x , y , n , 1 ) T (nx, ny, n^2, n)^T = \left( \begin{array}{} n&0&0&0\\ 0&n&0&0\\ a&b&c&d\\ 0&0&1&0 \end{array} \right) (x, y, n, 1)^T (nx,ny,n2,n)T= n0a00nb000c100d0 (x,y,n,1)T。分析该式中矩阵第三行的运算,无论x、y为何值, a x + b y + c n + d = n 2 ax+by+cn+d=n^2 ax+by+cn+d=n2恒成立,可知a、b均为0,则有 c n + d = n 2 cn+d=n^2 cn+d=n2。
由于远平面变换前后的中心点不变,设其为 ( 0 , 0 , f , 1 ) (0, 0, f, 1) (0,0,f,1),为了和上述齐次坐标对应,也同乘z(此时z=f),即 ( 0 , 0 , f 2 , 1 ) T = ( 0 , 0 , c , d ) ( 0 , 0 , f , 1 ) T (0, 0, f^2, 1)^T = (0, 0, c, d) (0, 0, f, 1)^T (0,0,f2,1)T=(0,0,c,d)(0,0,f,1)T,则有 c f + d = f 2 cf+d=f^2 cf+d=f2。
联立二式,解得 c = n + f c = n + f c=n+f, b = − n f b = -nf b=−nf。即变换矩阵 M p e r s → o r t h o = ( n 0 0 0 0 n 0 0 0 0 n + f − n f 0 0 1 0 ) M_{pers→ortho}=\left( \begin{array}{} n&0&0&0\\ 0&n&0&0\\ 0&0&n+f&-nf\\ 0&0&1&0 \end{array} \right) Mpers→ortho= n0000n0000n+f100−nf0
我们将公式运用到空间内任意一点 ( x i , y i , z i , 1 ) (x_i, y_i, z_i, 1) (xi,yi,zi,1),变换后的坐标为 ( n x i , n y i , ( n + f ) z i − n f , 1 ) (nx_i, ny_i, (n+f)z_i-nf, 1) (nxi,nyi,(n+f)zi−nf,1)。由于 n ≤ z i ≤ f n≤z_i≤f n≤zi≤f,可以得到:
- ① 当n≥1时, z ′ ≥ z z'≥z z′≥z,即物体向远处压缩
- ② 当f≤1时, z ′ ≤ z z'≤z z′≤z,即物体向近处压缩
- ③ 当n≤1但f≥1时, z ′ < n f n + f − 1 z'<\frac{nf}{n+f-1} z′<n+f−1nf的部分向近处压缩, z ′ > n f n + f − 1 z'>\frac{nf}{n+f-1} z′>n+f−1nf的部分向远处压缩。根据计算可知 n f n + f − 1 < n + f 2 \frac{nf}{n+f-1}<\frac{n+f}{2} n+f−1nf<2n+f,即大于一半的物体都被向远处压缩了。
2D模型→3D模型
能否通过一张2D照片得到3D的模型?以下是我寻找答案的过程。
“脑补”和“还原”是两回事
这里有一个非常生动形象的例子:

由此可见,仅凭一张图片是无法还原出精准的3D模型的,3D是比2D更高的维度,没有被看到的地方终究是信息缺失的。
深度信息
无法从单张2D图像生成3D图像,那退而求其次得到可见像素点的三维坐标应该可以吧?
“类似我们人眼看到的不是一张照片,而是两张,一定要估计深度信息” 但是我闭住一只眼和睁开两只眼看到的图像是一样的,只不过位置有些变换,所以我不觉得我两个眼睛看到的是深度信息,我觉得我即使用了两只眼睛,看到的也是2D的照片。 仔细想想,深度信息是必要的吗?
我盯着桌子上的杯子陷入了沉思…透视投影在深度方向上的计算给了我一个灵感,根据一个物体在照片中的直径以及物体本身的直径,应该可以计算出它的深度(只要知道了相机的位置和角度)。离我距离不同的杯子,我看到的直径和它实际的直径,一定有一个因“离我距离”不同而改变的换算公式。
可是这不符合我们的任务。我们希望根据一张照片去建模,照片上的物体直径可以测量,那物体本身的直径如何获得?显然因果关系反了。我们要做的,是在一张大桌子上,放着两个大小不同的正方体,大的距离我们远,小的距离我们近,照片里它们的大小是相等的,如何判断它们的大小关系和离相机的距离?
由此可见,深度是必要的。
先验知识
针对我认为睁一只眼闭一只眼和用两个眼睛看到的画面一样这个问题,我也想通了。看到的画面一样是因为我具有先验知识,而且我的大脑可以利用光影等为我处理这些信息,所以一只眼睛和两只眼睛好像没什么差别。其实都是3D的,因为我可以大致判断出房间里哪张桌子离我更远,哪张桌子离我更近,之前认为是2D画面完全就是因为睁眼和闭眼情况一样,而且我对3D没有概念,所以导致我误以为是2D图像。
同理,如果需要根据一张照片就生成3D模型,必须对原来的 3D 物体本身有先验知识。对于任意的物体,如果不利用多角度的拍摄图像获取3D信息生成点云,就要求提供和被重建物体同一类的三维模型来提供先验知识,从而利用单张图片生成3D模型。

使用传统的2D卷积神经网络来学习先验的形状知识1,应用方法和流程如下:
- 首先将学习从单个图像到一个点云的2D投影的映射,每个输入的RGB图像,预测的是n个视点处的2D投影。
- 将多个视角的2D点云投影融合成3D点云数据。
- 利用3D点云可以得到新视点处的有深度的图像,并通过伪渲染使其接近真实3D模型在该视点的投影。

2D模型和3D模型的配准与转化——工具
点云处理软件
点云处理软件用于手动编辑点云,一般包括功能如:手动编辑点云、自动清理和过滤、将任务卸载到云端、渲染、点距计算、登记、转换为网格、与 NURBS 对话等。
流行的点云处理软件包括:CloudCompare(免费且开源)、Point Cloud Library(免费且开源)、Leica Cyclone、Faro Scene、Autodesk Recap 、 Trimble RealWorks。
深度图渲染
untiy3d
Unity是实时3D互动内容创作和运营平台。包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者,借助Unity将创意变成现实。Unity平台提供一整套完善的软件解决方案 ,可用于创作、运营和变现任何实时互动的2D和3D内容,支持平台包括手机、平板电脑、PC、游戏主机、增强现实和虚拟现实设备。
这里应该用不到,所以就不放代码了。
- 渲染深度图。输出[0, 1]范围的深度值

- 相交高亮。

- 能量场。在相交高亮效果的基础上,加上半透明和边缘高亮

- 全局雾效。让雾的浓度随着深度值的增大而增大,然后进行的原图颜色和雾颜色的插值

- 边缘检测。取当前像素的附近4个角,分别计算出两个对角的深度值差异,将这两个差异值相乘就得到我们判断边缘的值

- 景深 (Depth Of Field)

opencv python
# depth 为单通道 16bit位深的深度图像
# xmin和xmax可以通过图像的计算深度图中的最大值和最小值,也可以手动设定
# xmin = np.min(self.depth)
# xmax = np.max(self.depth)
xmin = 0
xmax = 2500
depth_image = np.array((self.depth - xmin) / (xmax - xmin) * 255).astype(np.uint8)
# depth_image = cv2.cvtColor(depth_image, cv2.COLOR_GRAY2BGR)
depth_image = cv2.applyColorMap(depth_image, cv2.COLORMAP_JET)
cv2.imshow('depth', depth_image)
cv2.waitKey(0)

参考来源:
3D物体渲染到2D屏幕的矩阵变换过程:模型变换(Modeling Trans)、视图变换(View Trans)和投影变换(Projection Trans)
如何用latex编写矩阵(包括各类复杂、大型矩阵)
齐次坐标_百度百科
能通过一张照片(2D)得到3D的模型吗?
写给测绘行业外——什么是点云
点云解释:扫描、处理、3D 模型
点云基本概念
3D点云形状分类简介
三维点云深度学习技术综述
小白系列(5)| 计算机视觉:3D立体视觉
清华大学曹良才教授文章:2D到3D渲染法生成深度图的全息3D显示
立体视觉入门指南
Unity
Unity Shader - 深度图基础及应用(转)
opencv python 深度图渲染
根据 2D 图片构建 3D
参考论文:Learning Efficient Point Cloud Generation for Dense 3D Object Reconstruction ↩︎


——3D&spm=1001.2101.3001.5002&articleId=133757668&d=1&t=3&u=a2724dc7ee104c33bb9bd3d59f158673)
7283

被折叠的 条评论
为什么被折叠?



