Commit 6d738f6a authored by jmbuena's avatar jmbuena

Changed RANSAC Homography estimation for speed. Each minimal set is checked for…

Changed RANSAC Homography estimation for speed. Each minimal set is checked for consistency before actually fit a candidate homography.
parent 19229f2f
......@@ -69,6 +69,7 @@ protected:
virtual bool getSubset( const CvMat* m1, const CvMat* m2,
CvMat* ms1, CvMat* ms2, int maxAttempts=1000 );
virtual bool checkSubset( const CvMat* ms1, int count );
virtual bool isMinimalSetConsistent( const CvMat* m1, const CvMat* m2 ) { return true; };
CvRNG rng;
int modelPoints;
......
......@@ -68,6 +68,7 @@ public:
protected:
virtual void computeReprojError( const CvMat* m1, const CvMat* m2,
const CvMat* model, CvMat* error );
virtual bool isMinimalSetConsistent( const CvMat* m1, const CvMat* m2 );
};
......@@ -287,6 +288,85 @@ cvFindHomography( const CvMat* objectPoints, const CvMat* imagePoints,
return (int)result;
}
// We check whether three correspondences for the homography estimation
// are geometrically consistent (the points in the source image should
// maintain the same circular order than in the destination image).
//
// The usefullness of this constraint is explained in the paper:
//
// "Speeding-up homography estimation in mobile devices"
// Journal of Real-Time Image Processing. 2013. DOI: 10.1007/s11554-012-0314-1
// Pablo Marquez-Neila, Javier Lopez-Alberca, Jose M. Buenaposada, Luis Baumela
CV_IMPL bool
weakConstraint
(
const CvMat* srcPoints,
const CvMat* dstPoints,
int t1,
int t2,
int t3
)
{
const CvPoint2D64f* src = (const CvPoint2D64f*)srcPoints->data.ptr;
const CvPoint2D64f* dst = (const CvPoint2D64f*)dstPoints->data.ptr;
CvMat* A = cvCreateMat( 3, 3, CV_64F );
CvMat* B = cvCreateMat( 3, 3, CV_64F );
double detA;
double detB;
cvmSet(A, 0, 0, src[t1].x);
cvmSet(A, 0, 1, src[t1].y);
cvmSet(A, 0, 2, 1);
cvmSet(A, 1, 0, src[t2].x);
cvmSet(A, 1, 1, src[t2].y);
cvmSet(A, 1, 2, 1);
cvmSet(A, 2, 0, src[t3].x);
cvmSet(A, 2, 1, src[t3].y);
cvmSet(A, 2, 2, 1);
cvmSet(B, 0, 0, dst[t1].x);
cvmSet(B, 0, 1, dst[t1].y);
cvmSet(B, 0, 2, 1);
cvmSet(B, 1, 0, dst[t2].x);
cvmSet(B, 1, 1, dst[t2].y);
cvmSet(B, 1, 2, 1);
cvmSet(B, 2, 0, dst[t3].x);
cvmSet(B, 2, 1, dst[t3].y);
cvmSet(B, 2, 2, 1);
detA = cvDet(A);
detB = cvDet(B);
cvReleaseMat(&A);
cvReleaseMat(&B);
return (detA*detB >= 0);
};
// We check whether the minimal set of points for the homography estimation
// are geometrically consistent. We check if every 3 correspondences sets
// fulfills the constraint.
//
// The usefullness of this constraint is explained in the paper:
//
// "Speeding-up homography estimation in mobile devices"
// Journal of Real-Time Image Processing. 2013. DOI: 10.1007/s11554-012-0314-1
// Pablo Marquez-Neila, Javier Lopez-Alberca, Jose M. Buenaposada, Luis Baumela
bool
CvHomographyEstimator::isMinimalSetConsistent
(
const CvMat* srcPoints,
const CvMat* dstPoints
)
{
return weakConstraint(srcPoints, dstPoints, 0, 1, 2) &&
weakConstraint(srcPoints, dstPoints, 1, 2, 3) &&
weakConstraint(srcPoints, dstPoints, 0, 2, 3) &&
weakConstraint(srcPoints, dstPoints, 0, 1, 3);
}
/* Evaluation of Fundamental Matrix from point correspondences.
The original code has been written by Valery Mosyagin */
......
......@@ -152,6 +152,18 @@ bool CvModelEstimator2::runRANSAC( const CvMat* m1, const CvMat* m2, CvMat* mode
return false;
break;
}
// Here we check for model specific geometrical
// constraints that allow to avoid "runKernel"
// and not checking for inliers if not fulfilled.
//
// The usefullness of this constraint for homographies is explained in the paper:
//
// "Speeding-up homography estimation in mobile devices"
// Journal of Real-Time Image Processing. 2013. DOI: 10.1007/s11554-012-0314-1
// Pablo Márquez-Neila, Javier López-Alberca, José M. Buenaposada, Luis Baumela
if ( !isMinimalSetConsistent( ms1, ms2 ) )
continue;
}
nmodels = runKernel( ms1, ms2, models );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment