Understanding OpenCV homography at a minimum of points

Question:

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.

Asked By: not_converging

||

Answers:

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.

Answered By: not_converging

I have a similar problem I have a list of x and y values, and I would like to get the homography of those points by using a homography matrix. I found the homography matrix by selecting the points from the orthophoto image and the image captured manually.

I am confused about how to transform the x and y coordinates and plot them in the orthophoto image.

it would be great if I get some help with this.

Answered By: Arun