Class HomographyDirectLinearTransform
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 Summary
Modifier and TypeFieldDescriptionprotected DMatrixRMaj
protected NormalizationPoint2D
protected NormalizationPoint2D
protected SolveNullSpace<DMatrixRMaj>
-
Constructor Summary
ConstructorDescriptionHomographyDirectLinearTransform
(boolean normalizeInput) Configure homography calculation -
Method Summary
Modifier and TypeMethodDescriptionprotected int
addConicPairConstraints
(AssociatedPairConic a, AssociatedPairConic b, DMatrixRMaj A, int rowA) Add constraint for a pair of conicsprotected int
addConics
(List<AssociatedPairConic> points, DMatrixRMaj A, int rows) Adds the 9x9 matrix constraint for each pair of conics.protected int
addPoints2D
(List<AssociatedPair> points, DMatrixRMaj A, int rows) protected int
addPoints3D
(List<AssociatedPair3D> points, DMatrixRMaj A, int rows) protected boolean
computeH
(DMatrixRMaj A, DMatrixRMaj H) Computes the SVD of A and extracts the homography matrix from its null spaceboolean
process
(@Nullable List<AssociatedPair> points2D, @Nullable List<AssociatedPair3D> points3D, @Nullable List<AssociatedPairConic> conics, DMatrixRMaj foundH) More versatile process function.boolean
process
(List<AssociatedPair> points, DMatrixRMaj foundH) Computes the homography matrix given a set of observed points in two images.static void
Undoes normalization for a homography matrix.
-
Field Details
-
A
-
solverNullspace
-
N1
-
N2
-
-
Constructor Details
-
HomographyDirectLinearTransform
public HomographyDirectLinearTransform(boolean normalizeInput) Configure homography calculation- Parameters:
normalizeInput
- Should image coordinate be normalized? Needed when coordinates are in units of pixels.
-
-
Method Details
-
process
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' inAssociatedPair
refers to x1 and x2, respectively, in the equation below:
x2 = H*x1- Parameters:
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.- Returns:
- 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.- Parameters:
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 nullfoundH
- (Output) The estimated homography- Returns:
- True if successful. False if it failed.
-
computeH
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
-
addPoints3D
-
addConics
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
-