Search code examples
pythonopencvcomputer-visioncoordinate-transformationhomography

Understanding OpenCV homography at a minimum of points


I am quite intrigued by the idea of a homography and try to get it to work at a minimal example with python and OpenCV. Yet, my tests do not pass and I am not quite sure why. I pass in a set of corresponding points into the findHomography function according to This and then multiply the homography matrix to receive my new point.

so the idea behind it is to find the planar coordinate transformation and then transform the points with

X' = H@X

where X' are the new coordinates and X are the coordinates in the new coordinate frame.

Here is some minimal code example:

import cv2
import numpy as np
import matplotlib.pyplot as plt

points = np.array([
    [675, 585],
    [675, 1722],
    [3155, 580],
    [3162, 1722],
])
t_points = np.array([
    [0,0], 
    [0, 8.23], 
    [23.77, 0],
    [23.77, 8.23]
])

pt = np.array([675, 580+(1722-580)/2, 0])
pt_test = np.array([0,8.23/2, 0])

def get_h_matrix(src_list, dst_list):
    src_pts = np.array(src_list).reshape(-1,1,2)
    dst_pts = np.array(dst_list).reshape(-1,1,2)
    H, mask = cv2.findHomography(src_pts, dst_pts)
    return H

H = get_h_matrix(points, t_points)

transformed = H@pt

plt.scatter(t_points[:,0], t_points[:,1], color = 'blue')
plt.scatter(transformed[0], transformed[1], color = 'orange')
plt.scatter(pt_test[0], pt_test[1], color = 'green')
plt.show()

plt.scatter(points[:,0], points[:,1], color = 'blue')
plt.scatter(pt[0],pt[1], color = 'orange')
plt.show()

where the output corresponds to the following plot Plot of the coordinate Transformation. We can see that the green point, where the transformed point actually should be, is not even close to the orange point, where the homography transformed the point to.

Maybe somebody can see the error in my train of thoughts. Your help is kindly appreciated. EDIT: I swaped the points array a few times, because I thought I made a mistake, but still the wrong transformation.


Solution

  • As Micka mentioned in the comments, the problem is the representation of the test points.

    pt = [x,y,1]
    

    instead of

    pt = [x,y,0]
    

    after the transformation, the homogeneous coordinates get transformed back by

    pt' = pt'/pt'[2]
    

    I appreciate the help.