Merge pull request #289 from jmbuena:master
This commit is contained in:
commit
867ddebe07
@ -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,8 @@ 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 );
|
||||
virtual bool weakConstraint ( const CvMat* srcPoints, const CvMat* dstPoints, int t1, int t2, int t3 );
|
||||
};
|
||||
|
||||
|
||||
@ -287,6 +289,74 @@ 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
|
||||
bool
|
||||
CvHomographyEstimator::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 );
|
||||
|
Loading…
x
Reference in New Issue
Block a user