温馨提示:如遇公式错误,可在文末留言,欢迎指正。本文未经允许禁止转载。
单应矩阵描述的是空间中同一平面上的三维点在两张图像中的对应关系。这里需要强调的是同一平面。
单应矩阵可以应用在图像矫正、图像配准拼接、视角转换以及计算两张图像的相机运动(旋转和平移)上。
下面我们推导一下单应矩阵,本文讲述了两种推导方式。首先回忆一下相机模型矩阵:
其中:
[R T] 是一个3x4的矩阵,Xw是一个4x1的矩阵,K是一个3x3的矩阵。
图1 空间中同一点投影到两图像上
为了讨论更为一般的情况,我们假设两张图片来自于两个相机A、B(对应着左右图),这样两个相机的内参矩阵是不同的,分别为Ka、Kb。世界坐标系中的三维点到相机坐标系转换,对应的旋转、平移矩阵分别为:
这样一来,我们就可以得到两个相机模型矩阵。
将世界坐标系中的点用非齐次形式(头顶一飘~)表达为:
1. 推导一:
在相机坐标系下,空间中的平面模型为
是在相机坐标系下的非齐次坐标。
图2 相机看空间中的一个平面
接下来推导从左图(相机A)到右图(相机B)的映射矩阵,需要用到的式子先摆上(下标中带字母“ca”和“a”,对应相机A)。
是平面在相机A坐标系下的法向量,d表示该平面到相机A的垂直距离,是相机A坐标系下平面上的一点。
开启推导模式:
需要说明一下:
是上述平面在世界坐标系中的法向量。
(旋转矩阵R是正交矩阵,所以R的转置就等于R的逆)
至此,经过上述推导,两张图像中点的对应关系我们就得到了。
如果把世界坐标系和相机A坐标系重合,那么
上式化简为:
单应矩阵
H是一个3x3的矩阵,可以看出单应矩阵与两个相机之间的相对运动以及所拍摄平面特性有关系。
2. 推导二:
为了方便计算,假设所拍摄平面在世界坐标系中位于Z=0上。
这样Xw大小就由原来的4x1变成了3x1,旋转矩阵R中第三列就可以消去,[R T]变成了3x3的矩阵。
3. 如何计算H:
为两张图像中匹配的点对(可以利用sift、surf等描述子匹配获得),每一对匹配点,可以得到两个方程。H矩阵中h9是尺度,所以一共有8个未知数,则至少需要4对点就可以解出矩阵H。解H矩阵常用的一个方法是SVD分解,以后我们会讲一下SVD分解。
这里给出MATLAB中求解H的代码:
[U,S,V] =svd(A);
H=V(:,end);
H=reshape(H,3,3);
至此,单应矩阵的推导以及计算就讲解完了。这里仍然需要强调的是:使用单应矩阵,需要确保三维点在一个平面上。(当然并不是必须在一个平面上,因为如果三维点距离相机比较远,三维点之间的距离和其距离相机的距离相比就很小,那就可以认为在一个平面上了。)
本文同步更新微信公众号: