pythonopencvimage-processingcomputer-visionhomography

I'm not able to get the correct homography points


I'm trying to create homography matrix from this field: enter image description here

(source image with ids:) enter image description here

To the destination image: enter image description here

The points for the source points are:

pts_src = [[ 761,  704],
 [ 910,  292],
 [1109,  544],
 [ 619,  479],
 [ 656,  373 ],
 [1329,  446],
 [  20,  559],
 [  87,  664],
 [ 238,  501],
 [ 399,  450]]

And the points for destination points (new image):

pts_dst = [[147, 330],
 [ 35 , 20],
 [147, 225],
 [ 75, 203],
 [ 35, 155],
 [147, 155],
 [ 35, 317],
 [ 75, 351],
 [ 35, 237],
 [ 35, 203]]

I tried to create homography matrix with the following code:

import numpy as np
pts_src = np.array(pts_src)
pts_dst = np.array(pts_dst)
h, status = cv2.findHomography(pts_src, pts_dst) 
print(h) #homography matrix

And I got the following homography matrix:

[[ 4.00647822e-01  1.41196305e+00 -6.90548584e+02]
 [-1.28068526e-01  3.03783700e+00 -6.98945354e+02]
 [ 3.12182175e-04  4.06980322e-03  1.00000000e+00]]

I tried to check if the homography matrix is correct, so I used the first coordinate from the source image (761, 704), and check if I get the correct coordinate in destination image, which should be (147, 330). I tried to use the equation new_x, new_y, new_z = h*(x,y,z):

p = [761,  704, 1]
print(np.matmul(h, p))

And I got:

array([ 608.36639573, 1342.23174648,    4.1027121 ])

Which is very far (and for some reason the z is 4.1).

And I also tried the second point (910, 292), and I should get (35 , 20), but I got [86.33414416, 71.5606917 , 2.47246832].

Any idea why I'm not able to get the correct coordinates?


Solution

  • The solution was mentioned in the comments thanks to @fana - dividing the x and y coordinates by z (x/z, y/z).