本文链接:反解摄像机的投影矩阵
最近做实验苦于没有真实数据,以便同实验测量结果对比,计算误差大小。此时有一个想法即是,将实验的场景录制下来,然后从录像中找到对应时刻物体的位置,最终得到真实数据。这时就有一个难题:如何从图像中找到三维的坐标值?显然是不可能的,因为少了一维的数据量嘛。不过,在我们的应用场景下,高度是已知的,所以是二维到二维,完全可以得到。
齐次向量
首先我们需要反解摄像机的投影矩阵,这里有一些线性代数和图形学的知识。摄像机的投影是一个三维到二维的投影。一般来说,从三维向量到二维向量
的投影可以写作
的矩阵
,使
(这里的向量都是纵向量)。不过这种向量和矩阵不能表示摄像机的投影矩阵。其一,它不能表示平移;其二,它不能产生近大远小的效果。要改进的话,就要使用齐次向量。
所谓齐次向量,就是给普通向量加一个单位长度。如果一个二维向量是,那么对应的一个齐次向量就是
。如果一个齐次向量是
,那么对应的普通向量就是
。一个普通向量有无穷个齐次向量对应,一个齐次向量不一定有对应的普通向量(比如
)。
投影矩阵
由于引入了齐次向量,投影矩阵也变成了的矩阵,在此不妨写开:
那么,就可以写成:
因为是齐次坐标的单位向量,所以等式两边不都需要写成
。而且,在我们的使用中,所有的
都不可能为0。此式可以写成以下形式:
由此,我们的目的就是解出投影矩阵的每一项。
线性方程组
如果我们已知个投影前的点的坐标
和投影后的点的坐标
,每个坐标代入
可以得到方程组:
也就是:
如果把所有方程列出来的话就是这样的:
这个方程组共有个未知量,
个方程。如果要解出解来,须
,也就是
。但是还有一个问题,这个方程组是齐次方程组,也就是说:或者所有未知量都为
,或者方程之间相关。这里当然是后者。如果我们分析一下
这个式子,会发现等式左侧的
项可以是任意值,而它又是
和确定的
相乘的结果,所以矩阵
带有一个和
相当的不确定因素。也就是说只要矩阵
中的
个元素确定了以后,剩下的那个元素的值就已经确定了。具体到我们的方程组上,就是我们可以把一个未知量设为定值,将齐次方程组变为非齐次方程组。
根据之前的推论,按理说应当把中的一个元素设为定值。但这里我们不这么做,原因是
中的元素可能为
,如果恰好给了一个零元素非零值,那就解不出来了。这里还是对
开刀,设
,那么方程就化为:
简化记为:
最小二乘法
上述的方程由于方程个数大于未知量个数,所以不能直接解,而是用最小二乘法求出误差最小的解。对于使用matlab或其他数学库的人来说,本节内容可以跳过了,因为直接调用库函数就好了。
对于一个解,误差为:
最小二乘法的目标是最小化误差的平方,也就是:
设:
则是一个多元二次函数,每一元都是一抛物线,且开口都朝上,只要找到导数为
的点即是
最小的点。
这是一个简单的非齐次方程组,用高斯消元法解之即可。
总结
在求出之后,就可从中取出
,组成投影矩阵
了。
ddd