Class SevenPointsFundamentalMatrixEstimator

java.lang.Object
com.irurueta.ar.epipolar.estimators.FundamentalMatrixEstimator
com.irurueta.ar.epipolar.estimators.SevenPointsFundamentalMatrixEstimator

public class SevenPointsFundamentalMatrixEstimator extends FundamentalMatrixEstimator
Non-robust fundamental matrix estimator that uses 7 matched 2D points on left and right views. Although this algorithm requires one less point than the 8 points algorithm, it might return up to three different fundamental matrices that must be later checked (i.e. using a robust algorithm to maximize inliers) so that the correct solution is picked. If the correct solution is found, it typically obtains results with higher accuracy than the 8 points algorithm, because rank-2 is not approximated using SVD, and rather it is accurately enforced.
  • Field Details

    • DEFAULT_ALLOW_LMSE_SOLUTION

      public static final boolean DEFAULT_ALLOW_LMSE_SOLUTION
      Constant indicating that by default an LMSE solution is not allowed.
      See Also:
    • MIN_REQUIRED_POINTS

      public static final int MIN_REQUIRED_POINTS
      Minimum number of matched 2D points to start the estimation.
      See Also:
    • DEFAULT_NORMALIZE_POINT_CORRESPONDENCES

      public static final boolean DEFAULT_NORMALIZE_POINT_CORRESPONDENCES
      Indicates if by default provided point correspondences are normalized to increase the accuracy of the estimation.
      See Also:
    • EPS

      public static final double EPS
      Tiniest value closest to zero.
      See Also:
    • allowLMSESolution

      private boolean allowLMSESolution
      Indicates whether an LMSE (the Least Mean Square Error) solution is allowed or not. When an LMSE solution is allowed, more than 7 matched points can be used for fundamental matrix estimation. If LMSE solution is not allowed then only the 7 former matched points will be taken into account.
    • normalizePoints

      private boolean normalizePoints
      Indicates whether provided matched 2D points must be normalized to increase the accuracy of the estimation.
  • Constructor Details

    • SevenPointsFundamentalMatrixEstimator

      public SevenPointsFundamentalMatrixEstimator()
      Constructor.
    • SevenPointsFundamentalMatrixEstimator

      public SevenPointsFundamentalMatrixEstimator(List<com.irurueta.geometry.Point2D> leftPoints, List<com.irurueta.geometry.Point2D> rightPoints)
      Constructor with matched 2D points.
      Parameters:
      leftPoints - 2D points on left view.
      rightPoints - 2D points on right view.
      Throws:
      IllegalArgumentException - if provided list of points do not have the same length.
  • Method Details

    • isLMSESolutionAllowed

      public boolean isLMSESolutionAllowed()
      Returns boolean indicating whether an LMSE (the Least Mean Square Error) solution is allowed or not. When an LMSE solution is allowed, more than 8 matched points can be used for fundamental matrix estimation. If LMSE solution is not allowed then only the 7 former matched points will be taken into account.
      Returns:
      true if an LMSE solution is allowed, false otherwise.
    • setLMSESolutionAllowed

      public void setLMSESolutionAllowed(boolean allowed) throws com.irurueta.geometry.estimators.LockedException
      Sets boolean indicating whether an LMSE (the Least Mean Square Error) solution is allowed or not. When an LMSE solution is allowed, more than 8 matched points can be used for fundamental matrix estimation. If LMSE solution is not allowed then only the 7 former matched points will be taken into account.
      Parameters:
      allowed - true if an LMSE solution is allowed, false otherwise.
      Throws:
      com.irurueta.geometry.estimators.LockedException - if this instance is locked because an estimation is in progress.
    • arePointsNormalized

      public boolean arePointsNormalized()
      Indicates whether provided matched 2D points must be normalized to increase the accuracy of the estimation.
      Returns:
      true if points must be normalized, false otherwise.
    • setPointsNormalized

      public void setPointsNormalized(boolean normalizePoints) throws com.irurueta.geometry.estimators.LockedException
      Sets boolean indicating whether provided matched 2D points must be normalized to increase the accuracy of the estimation.
      Parameters:
      normalizePoints - true if points must be normalized, false otherwise.
      Throws:
      com.irurueta.geometry.estimators.LockedException - if this instance is locked because an estimation is in progress.
    • isReady

      public boolean isReady()
      Returns boolean indicating whether estimator is ready to start the fundamental matrix estimation. This is true when the required minimum number of matched points is provided to obtain a solution and both left and right views have the same number of matched points.
      Specified by:
      isReady in class FundamentalMatrixEstimator
      Returns:
      true if estimator is ready to start the fundamental matrix estimation, false otherwise.
    • estimateAll

      public List<FundamentalMatrix> estimateAll() throws com.irurueta.geometry.estimators.LockedException, com.irurueta.geometry.estimators.NotReadyException, FundamentalMatrixEstimatorException
      Estimates all possible fundamental matrices found using provided points. Because the algorithm uses 7 points and enforces rank 2 by solving a third degree polynomial, the algorithm might return 1 real solution (and 2 imaginary ones which are discarded), 3 real solutions, or 1 real solution with triple multiplicity.
      Returns:
      all possible fundamental matrices found using provided points.
      Throws:
      com.irurueta.geometry.estimators.LockedException - if estimator is locked doing an estimation.
      com.irurueta.geometry.estimators.NotReadyException - if estimator is not ready because required input points have not already been provided.
      FundamentalMatrixEstimatorException - if configuration of provided 2D points is degenerate and fundamental matrix estimation fails.
    • estimateAll

      public void estimateAll(List<FundamentalMatrix> result) throws com.irurueta.geometry.estimators.LockedException, com.irurueta.geometry.estimators.NotReadyException, FundamentalMatrixEstimatorException
      Estimates all possible fundamental matrices found using provided points and adds the result to provided result list. Because the algorithm uses 7 points and enforces rank 2 by solving a third degree polynomial, the algorithm might return 1 real solution (and 2 imaginary ones which are discarded), 3 real solutions, or 1 real solution with triple multiplicity.
      Parameters:
      result - list where results will be stored.
      Throws:
      com.irurueta.geometry.estimators.LockedException - if estimator is locked doing an estimation.
      com.irurueta.geometry.estimators.NotReadyException - if estimator is not ready because required input points have not already been provided.
      FundamentalMatrixEstimatorException - if configuration of provided 2D points is degenerate and fundamental matrix estimation fails.
    • estimate

      public FundamentalMatrix estimate() throws com.irurueta.geometry.estimators.LockedException, com.irurueta.geometry.estimators.NotReadyException, FundamentalMatrixEstimatorException
      Estimates a fundamental matrix using provided lists of matched points on left and right views. This method returns a solution only if one possible solution exists. If more than one solution is available, this method will fail. Because this algorithm might return more than one solution, it is highly encouraged to use estimateAll method instead.
      Specified by:
      estimate in class FundamentalMatrixEstimator
      Returns:
      a fundamental matrix.
      Throws:
      com.irurueta.geometry.estimators.LockedException - if estimator is locked doing an estimation.
      com.irurueta.geometry.estimators.NotReadyException - if estimator is not ready because required input points have not already been provided.
      FundamentalMatrixEstimatorException - if configuration of provided 2D points is degenerate and fundamental matrix estimation fails or more than one solution exists.
    • getMethod

      Returns method of non-robust fundamental matrix estimator.
      Specified by:
      getMethod in class FundamentalMatrixEstimator
      Returns:
      method of fundamental matrix estimator.
    • getMinRequiredPoints

      public int getMinRequiredPoints()
      Returns minimum number of matched pair of points required to start the estimation. This implementation requires a minimum of 7 points.
      Specified by:
      getMinRequiredPoints in class FundamentalMatrixEstimator
      Returns:
      minimum number of matched pair of points required to start the estimation. Always returns 7.
    • enforceRank2

      private boolean enforceRank2(com.irurueta.algebra.Matrix matrix, com.irurueta.algebra.SingularValueDecomposer decomposer) throws com.irurueta.algebra.AlgebraException
      Enforces rank 2 into provided matrix. This method modifies provided matrix.
      Parameters:
      matrix - matrix to be enforced to have rank 2.
      decomposer - an SVD decomposer.
      Returns:
      false if rank was successfully enforced, true otherwise.
      Throws:
      com.irurueta.algebra.AlgebraException - if an error occurs during SVD decomposition because of numerical instabilities.
    • computeParams

      private void computeParams(double a, double b, double c, double d, double e, double f, double[] out)
      Computes parameters of third degree polynomial to obtain possible solutions.
      Parameters:
      a - 1st param.
      b - 2nd param.
      c - 3rd param.
      d - 4th param.
      e - 5th param.
      f - 6th param.
      out - array of length 4 where partial parameters of third degree polynomial are stored.