网上有很多单应性矩阵的求解方法,但很少给出用4点求解单应性矩阵的方法和源代码的详细说明。 在这里说一下自己的理解。
首先发布matlab代码
%返回值h是3*3的矩阵
% pts1和pts2是与2*4坐标矩阵对应的特征点的(x,y )坐标
n=size (pt S1,2 );
a=Zeros(2*n,9 );
a(1:2:2*n,1:2 )=PTS1 ';
a(1:2:2*n,3 )=1;
a ) 233602:2*n,4:5 )=PTS1 ';
a ) 233602:2*n,6 )=1;
x1=pt S1 (1, );
y1=pt S1 (2, );
x2=pts2(1, ) );
y2=pts2(2, ) );
a(1:2:2*n,7 )=-x2.*x1;
a ) 233602:2*n,7 )=-y2.*x1;
a(1:2:2*n,8 )=-x2.*y1;
a ) 233602:2*n,8 )=-y2.*y1;
a ) A(1:2:2*n,9 )=-x2;
a ) 233602:2*n,9 )=-y2;
[evec,~]=EIG(a'*a );
h=reshape(EVEC ) :1 ),[ 3,3 ] ) );
h=h/h (结束); % makeh (3,3 )=1
在齐次坐标中,假设一点p(Xi,yi,1 )经过h矩阵的变换成为p )、yi )、1 ),即p )=h*p,通常对于透视变换,h矩阵有8自由度,需要求出至少4对特征点四个特征点对可以建立八个方程。 那么,对于有n对特征点的情况(超定方程),求解p'=H*p方程可以转化为亚纯方程组Ax=0的求解。 另一方面,Ax=0的求解被转换为min ||Ax||2的非线性优化问题(超稳态方程通过最大zqdtn次幂拟合得到近似解)。
对于给定点(xi,yi ),其变换可以表示为p'=H*p,赋值展开如下:
(1) ) ) )。
那么,得到:
(2) ) ) )。
进一步转换为:
(3) ) )。
这将创建系数矩阵。
(4) ) )。
可以使用系数矩阵建立以下线性方程: Ax=0:
(5) ) )。
也就是说:
(6) ) )。
)6)这样的超稳态方程式,可以用最zqdtn乘方求解。 通过对系数矩阵a求特征值和特征向量而得到。 用以下方法得到zqdtn乘方解最多:
([V,d]=EIG(a'*a ) )7) ) ) ) )。
其中,d表示由特征值对角矩阵(特征值沿主对角线降序),v表示与d特征值对应的特征向量)构成的特征矩阵,a )表示a的倒排。 其最大zqdtn乘方解是v(1),与系数矩阵a的最小特征值对应的特征向量是超联立方程组Ax=0的最大zqdtn乘方解。
至此,已经找到了h矩阵,后续可以通过随机采样一致性(RANSC )精选,也可以通过LM优化。
请注明出处