Class HomographyDirectLinearTransform


public class HomographyDirectLinearTransform extends Object

Using linear algebra it computes a planar homography matrix using 2D points, 3D points, or conics. Typically used as an initial estimate for a non-linear optimization. See [1] for 2D and 3D points, and [2] for conics.

The algorithm works by solving the equation below:
hat(x2)*H*x1 = 0
where hat(x) is the skew symmetric cross product matrix. To solve this equation is is reformatted into A*Hs=0 using the Kronecker product and the null space solved for.

The conic algorithm specifies a constraint using a pair of conics. A minimum of 3 conics are required for a unique solution using this linear method [2]. If all possible pairs are used then the growth is O(N^2) instead linear set of pairs are added which has O(N) growth by adding adjacent conics as pairs. This behavior can be toggled.

[1] Chapter 4, "Multiple View Geometry in Computer Vision" 2nd Ed. but uses normalization from "An Invitation to 3-D Vision" 2004.
[2] Kannala, Juho, Mikko Salo, and Janne Heikkilä. "Algorithms for Computing a Planar Homography from Conics in Correspondence." BMVC. 2006.

  • Field Details

  • Constructor Details

    • HomographyDirectLinearTransform

      public HomographyDirectLinearTransform(boolean normalizeInput)
      Configure homography calculation
      normalizeInput - Should image coordinate be normalized? Needed when coordinates are in units of pixels.
  • Method Details

    • process

      public boolean process(List<AssociatedPair> points, DMatrixRMaj foundH)

      Computes the homography matrix given a set of observed points in two images. A set of AssociatedPair is passed in. The computed homography 'H' is found such that the attributes 'p1' and 'p2' in AssociatedPair refers to x1 and x2, respectively, in the equation below:
      x2 = H*x1

      points - A set of observed image points that are generated from a planar object. Minimum of 4 pairs required.
      foundH - Output: Storage for the found solution. 3x3 matrix.
      True if successful. False if it failed.
    • process

      public boolean process(@Nullable @Nullable List<AssociatedPair> points2D, @Nullable @Nullable List<AssociatedPair3D> points3D, @Nullable @Nullable List<AssociatedPairConic> conics, DMatrixRMaj foundH)
      More versatile process function. Lets any of the supporting data structures be passed in.
      points2D - List of 2D point associations. Can be null.
      points3D - List of 3D point or 2D line associations. Can be null.
      conics - List of conics. Can be null
      foundH - (Output) The estimated homography
      True if successful. False if it failed.
    • computeH

      protected boolean computeH(DMatrixRMaj A, DMatrixRMaj H)
      Computes the SVD of A and extracts the homography matrix from its null space
    • undoNormalizationH

      public static void undoNormalizationH(DMatrixRMaj M, NormalizationPoint2D N1, NormalizationPoint2D N2)
      Undoes normalization for a homography matrix.
    • addPoints2D

      protected int addPoints2D(List<AssociatedPair> points, DMatrixRMaj A, int rows)
    • addPoints3D

      protected int addPoints3D(List<AssociatedPair3D> points, DMatrixRMaj A, int rows)
    • addConics

      protected int addConics(List<AssociatedPairConic> points, DMatrixRMaj A, int rows)

      Adds the 9x9 matrix constraint for each pair of conics. To avoid O(N^2) growth the default option only adds O(N) pairs. if only conics are used then a minimum of 3 is required. See [2].

      inv(C[1]')*(C[2]')*H - H*invC[1]*C[2] == 0 Note: x' = H*x. C' is conic from the same view as x' and C from x. It can be shown that C = H^T*C'*H
    • addConicPairConstraints

      protected int addConicPairConstraints(AssociatedPairConic a, AssociatedPairConic b, DMatrixRMaj A, int rowA)
      Add constraint for a pair of conics