c++opencvcomputer-visionprojective-geometry

# OpenCV findHomography giving inacurate result

I am having trouble with the `findHomography` function in OpenCV, it is not translating even my corner points correctly.

Here is the code I have to calculate the homography.

``````std::vector<cv::Point> srcPts = board.getCornerPoints();
// Image size : 640x480
// [158, 110;
//  488, 114;
//  507, 296;
//  100, 284]

const std::vector<cv::Point2f> destPts {
cv::Point2f(-0.5, 0.5),
cv::Point2f(0.5, 0.5),
cv::Point2f(0.5, -0.5),
cv::Point2f(-0.5, -0.5),
};
cv::Mat H = cv::findHomography(srcPts, destPts);
``````

The goal is to transform the points in the corners of the selected object to a plane between -0.5 and 0.5. However, when trying on the upper left corner with this code :

``````cv::Point pt = boardDetector.getCornerPoints()[0];
cv::Mat test = (cv::Mat_<double>(3, 1) << pt.x, pt.y, 1);
cv::Mat H_pt = H * test;
``````

Instead of getting `(-0.5, 0.5)` I'm getting `(-0.59675, 0.59675)`.

When changing the coordinates of the corner points to camera coordinates by multiplying them with the camera matrix the results are even worse too.

I have tried specifying the method used by `findHomography` myself but it didn't change anything.

Any ideas on why the result is inaccurate?

Thanks

Solution

• After multiplication, you still need to project your 2D point onto the `w=1` plane (vector being `(x,y,w)`, `w` being the last coordinate). You do that by dividing the vector by that value in the vector.

Or just use `cv::perspectiveTransform(points, mat)`.