从零开始的三维重建(一)—— 矩阵变换

想了很久应该从哪里开始说这三维重建的故事,其实最早人们都是用一些类似几何变换和投影技术来实现三维物体的重建,后来才逐渐有了光栅化、点云、网格等等表示方式,再到现在基于计算机算力的高速发展,又有了基于神经网络的种种方法。随便哪个挑出来说都是很长的一期。三维重建本身就是一个囊括了计算机视觉、计算机图形学、图像处理等多个领域的工作,因此想了很久以后我决定先从矩阵的变换开始说起。因为无论是三维空间中物体的变换还是相机标定等等,包括后期的算法都是从一开始的矩阵变换开始的,因此打好一开始矩阵变换的基础我想才是最重要的。
那么三维重建中我们常见的矩阵变换都有什么呢?看过很多这方面相关的讲解,感觉说的最全最好的版本是B站up的视频授课版本,课程名如下,课程链接也一并给出:GAMES101-现代计算机图形学入门-闫令琪。当然我写这篇文章的时候也不会完全照搬视频内容,虽然会有所参考,但也会加上一些我从各个地方看到的内容进行总结陈述,那么正文开始。

二维变换

我们先从都较为熟悉的二维中的变换开始说起吧。对于简单的向量加减点乘叉乘还有矩阵的一些基本性质等等我就不再重复了。在三维重建中,我们一般默认一个向量是先写纵列再写横列的,如果想表示两个向量点乘的结果,我们一般会写成xTy。
我们先来看一些二维平面中的矩阵变换。在二维空间中我们可能会对图片做出缩放、旋转、切变、平移等操作。对于图片上任意一点(x,y)来说,我们完成一种变换所需要的矩阵示例如下:
缩放:
[ x 1 y 1 ] = [ s 1 0 0 s 2 ] [ x y ] \begin{bmatrix} x1 \\ y 1 \end{bmatrix} =\begin{bmatrix} s1 & 0 \\ 0 & s2 \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix} [x1y1]=[s100s2][xy]
s1和s2可以取不同值,代表不同尺度上的缩放,当s1和s2取负值的时候代表对称。
旋转:
[ x 1 y 1 ] = [ c o s θ − s i n θ s i n θ c o s θ ] [ x y ] \begin{bmatrix} x1 \\ y 1 \end{bmatrix} =\begin{bmatrix} cosθ & -sinθ \\ sinθ & cosθ \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix} [x1y1]=[cosθsinθsinθcosθ][xy]
切变:
[ x 1 y 1 ] = [ 1 a 0 1 ] [ x y ] \begin{bmatrix} x1 \\ y 1 \end{bmatrix} =\begin{bmatrix} 1 & a \\ 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix} [x1y1]=[10a1][xy]
当然有的人可能好奇为什么我没有把平移写到一起,因为平移是一个非线性变换,简单来说我们是无法用一个2×2的齐次线性矩阵来表示平移(可以自己尝试一下或者上网查,这里只说结论),但我们又不想用一个非齐次的矩阵来表示,因为这样会使后续的计算变得复杂,所以对于平移,我们可以使用3×3的齐次矩阵来表示如下。
平移:
[ x 1 y 1 1 ] = [ 1 0 t 1 0 1 t 2 0 0 1 ] [ x y 1 ] \begin{bmatrix} x1 \\ y1 \\ 1 \end{bmatrix} =\begin{bmatrix} 1 & 0 & t1 \\ 0 & 1 & t2 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} x1y11 = 100010t1t21 xy1
其中t1和t2分别代表x向和y向的位移距离。
那我们现在用3×3的矩阵来重写缩放、旋转和切变的矩阵试试看。
缩放:
[ x 1 y 1 1 ] = [ s 1 0 0 0 s 2 0 0 0 1 ] [ x y 1 ] \begin{bmatrix} x1 \\ y1 \\ 1 \end{bmatrix} =\begin{bmatrix} s1 & 0 & 0\\ 0 & s2 & 0\\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} x1y11 = s1000s20001 xy1
旋转:
[ x 1 y 1 1 ] = [ c o s θ − s i n θ 0 s i n θ c o s θ 0 0 0 1 ] [ x y 1 ] \begin{bmatrix} x1 \\ y1 \\ 1 \end{bmatrix} =\begin{bmatrix} cosθ & -sinθ & 0\\ sinθ & cosθ & 0\\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} x1y11 = cosθsinθ0sinθcosθ0001 xy1
切变:
[ x 1 y 1 1 ] = [ 1 a 0 0 1 0 0 0 1 ] [ x y 1 ] \begin{bmatrix} x1 \\ y1 \\ 1 \end{bmatrix} =\begin{bmatrix} 1 & a & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} x1y11 = 100a10001

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值