单应性矩阵的理解及求解4

https://blog.csdn.net/hudaliquan/article/details/52121832

网上有很多关于单应性矩阵的求解方法,但都没有说明怎样用四点求解单应性矩阵或者源码详细说明很少。这里说说自己的理解。

    首先贴出matlab代码

 
  1. % 返回值 H 是一个3*3的矩阵

  2. % pts1 和 pts2是2*4的坐标矩阵对应特征点的(x,y)坐标

  3. n = size(pts1,2);

  4. A = zeros(2*n,9);

  5. A(1:2:2*n,1:2) = pts1';

  6. A(1:2:2*n,3) = 1;

  7. A(2:2:2*n,4:5) = pts1';

  8. A(2:2:2*n,6) = 1;

  9. x1 = pts1(1,:)';

  10. y1 = pts1(2,:)';

  11. x2 = pts2(1,:)';

  12. y2 = pts2(2,:)';

  13. A(1:2:2*n,7) = -x2.*x1;

  14. A(2:2:2*n,7) = -y2.*x1;

  15. A(1:2:2*n,8) = -x2.*y1;

  16. A(2:2:2*n,8) = -y2.*y1;

  17. A(1:2:2*n,9) = -x2;

  18. A(2:2:2*n,9) = -y2;

  19.  
  20. [evec,~] = eig(A'*A);

  21. H = reshape(evec(:,1),[3,3])';

  22. H = H/H(end); % make H(3,3) = 1

    在齐次坐标中,假设一点p(xi,yi,1)经过H矩阵的变换变为p‘(xi',yi',1),即 p' = H*p,通常,对于透视变换,H矩阵有8个自由度,这样至少需要4对特征点对求解。4个特征点对可以建立8个方程。那么对于有n对特征点的情况(超定方程),解p' = H*p方程组可以转化为对齐次方程组Ax = 0 的求解。而对 Ax = 0 的求解转化为 min ||Ax||2 的非线性优化问题(超定方程,通过最小二乘拟合得到近似解)。

对于某一点(xi,yi),其变换可表述为 p' = H*p,代入展开可得:

                (1)

    那么可得:

                      (2)

    进一步变换为:

   (3)

    这样便可构造系数矩阵:

            (4)

    通过系数矩阵我们可以构造出齐次线性方程组(Ax = 0):

                     (5)

    即:

                (6)

    对于(6)这样的超定方程求解,可以通过最小二乘的方式求解。通过对系数矩阵A求取特征值和特征向量得到。通过以下方式获得最小二乘解:

[V,D] = eig(A'*A)                                      (7)

    其中D是特征值对角矩阵(特征值沿主对角线降序),V是对应D特征值的特征向量(列向量)组成的特征矩阵,A'表示A的转置。其最小二乘解为V(1),即系数矩阵A最小特征值对应的特征向量就是超定方程组Ax = 0的最小二乘解。

至此,H矩阵已经求取,后续可以通过随机采样一致性(RANSC)进行精选,或者通过LM进行优化。

猜你喜欢

转载自blog.csdn.net/lyhbkz/article/details/82254901
今日推荐