# Class HomographyDirectLinearTransform

java.lang.Object
boofcv.alg.geo.h.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 Summary

Fields
Modifier and Type Field Description
`protected DMatrixRMaj` `A`
`protected NormalizationPoint2D` `N1`
`protected NormalizationPoint2D` `N2`
`protected SolveNullSpace<DMatrixRMaj>` `solverNullspace`
• ## Constructor Summary

Constructors
Constructor Description
`HomographyDirectLinearTransform​(boolean normalizeInput)`
Configure homography calculation
• ## Method Summary

Modifier and Type Method Description
`protected int` ```addConicPairConstraints​(AssociatedPairConic a, AssociatedPairConic b, DMatrixRMaj A, int rowA)```
Add constraint for a pair of conics
`protected 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 space
`SolveNullSpace<DMatrixRMaj>` `getSolverNullspace()`
`boolean` `isExhaustiveConics()`
`boolean` `isNormalize()`
`boolean` ```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.
`void` `setExhaustiveConics​(boolean exhaustiveConics)`
`static void` ```undoNormalizationH​(DMatrixRMaj M, NormalizationPoint2D N1, NormalizationPoint2D N2)```
Undoes normalization for a homography matrix.

### Methods inherited from class java.lang.Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

• ## 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

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

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 null
`foundH` - (Output) The estimated homography
Returns:
True if successful. False if it failed.
• ### computeH

protected boolean computeH​(
Computes the SVD of A and extracts the homography matrix from its null space
• ### undoNormalizationH

public static void undoNormalizationH​(
Undoes normalization for a homography matrix.

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

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

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

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

public  getSolverNullspace()
• ### isNormalize

public boolean isNormalize()
• ### isExhaustiveConics

public boolean isExhaustiveConics()
• ### setExhaustiveConics

public void setExhaustiveConics​(boolean exhaustiveConics)