diff -rupN OpenCV-2.4.0/modules/calib3d/src/fundam.cpp OpenCV-2.4.0-ransac_with_constraints/modules/calib3d/src/fundam.cpp
--- OpenCV-2.4.0/modules/calib3d/src/fundam.cpp	2012-04-01 12:10:37.000000000 +0200
+++ OpenCV-2.4.0-ransac_with_constraints/modules/calib3d/src/fundam.cpp	2012-05-25 13:00:41.000000000 +0200
@@ -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,83 @@ cvFindHomography( const CvMat* objectPoi
     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 resource-limited computing devices"
+// Pablo Márquez-Neila, Javier López-Alberca, José 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 resource-limited computing devices"
+// Pablo Márquez-Neila, Javier López-Alberca, José 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 */
Los ficheros binarios OpenCV-2.4.0/modules/calib3d/src/.fundam.cpp.swp y OpenCV-2.4.0-ransac_with_constraints/modules/calib3d/src/.fundam.cpp.swp son distintos
diff -rupN OpenCV-2.4.0/modules/calib3d/src/modelest.cpp OpenCV-2.4.0-ransac_with_constraints/modules/calib3d/src/modelest.cpp
--- OpenCV-2.4.0/modules/calib3d/src/modelest.cpp	2012-04-01 12:10:37.000000000 +0200
+++ OpenCV-2.4.0-ransac_with_constraints/modules/calib3d/src/modelest.cpp	2012-05-27 19:58:01.000000000 +0200
@@ -154,6 +154,17 @@ bool CvModelEstimator2::runRANSAC( const
             }
         }
 
+        // 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 resource-limited computing devices"
+        // Pablo Márquez-Neila, Javier López-Alberca, José M. Buenaposada, Luis Baumela
+        if ( !isMinimalSetConsistent( ms1, ms2 ) )
+          continue;
+
         nmodels = runKernel( ms1, ms2, models );
         if( nmodels <= 0 )
             continue;
diff -rupN OpenCV-2.4.0/modules/calib3d/src/_modelest.h OpenCV-2.4.0-ransac_with_constraints/modules/calib3d/src/_modelest.h
--- OpenCV-2.4.0/modules/calib3d/src/_modelest.h	2012-04-01 12:10:37.000000000 +0200
+++ OpenCV-2.4.0-ransac_with_constraints/modules/calib3d/src/_modelest.h	2012-05-25 12:59:48.000000000 +0200
@@ -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;
Los ficheros binarios OpenCV-2.4.0/modules/calib3d/src/._modelest.h.swp y OpenCV-2.4.0-ransac_with_constraints/modules/calib3d/src/._modelest.h.swp son distintos
Los ficheros binarios OpenCV-2.4.0/modules/python/src2/hdr_parser.pyc y OpenCV-2.4.0-ransac_with_constraints/modules/python/src2/hdr_parser.pyc son distintos
