Search code examples
opencvhomographyransac

OpenCV CV findHomography assertion error - counter => 4


I'm currently finishing my evaluation-tool for interest point detectors. In the last steps I found a confusing error.

Mat findHomography(InputArray srcPoints, InputArray dstPoints, int method=0, double ransacReprojThreshold=3, OutputArray mask=noArray() )

The srcPoints and dstPoints are vector<Points2f> which stores the corresponding points of the matched keypoints. So far nothing special - It's like in the tutorials.

But when I use RANSAC and have a vector<Points2f> in range [0, ... , 4], I get an assertion error than the counter should be greater or equals four.

Question 1: Does the algorithm needs at least four points to describe what belongs to the current model or not and to create the consensus?

Question 2: Is there any documentation about this? (I took a look at the doc and the tutorials.)

Please note that I already have seen this question. But there is no satisfying answer for the behaviour of RANSAC. Or should I accept that this methods needs at least four points to find the homography?

Thanks for your help.


Solution

  • A homography cannot be computed with less than 4 pairs of points. That is because with only 3 points there is a perspective ambiguity. Picture a triangle

    a
    
    
    b        c
    

    in image 1. In image 2 the points have been transformed to look like this

    a
    
    
    b    c
    

    The distance between b and c has been cut in half. Unfortunately you don't know if that is because point c got closer to your or farther from you. With a 4th point the difference becomes clear.

    a        d
    
    
    b        c
    

    Here is a square in image 1

         d
    
    
    a        
    
    
    b    c    
    

    here d and c rotated towards you

    a     
    
         d
    b    c   
    

    and here they rotated away from you.

    I don't see this requirement in the openCV documentation but if you find any resources on homography calculation you won't have to read very far before you find this requirement and a more rigorous proof of 4 points being sufficient.