Wie kann ich die Homographie-H-Matrix zwischen den beiden Bildern berechnen, wenn die Kamera eine reine Schwenkdrehung durchführt?
H ist eine 3 x 3-Matrix, H[0,0], H[0,1], H[1,0], H[1,1] scheinen aus der Rotationsmatrix leicht zu erhalten zu sein, aber was ist mit den anderen Elementen?
Theoretisch Hintergrund
Gegeben eine Kameramatrix
Code: Select all
K = np.diag([f, f, 1])
Die Position des Kamerazentrums in Weltraumkoordinaten
Code: Select all
Tw = np.array([tx, ty, tz])
Code: Select all
ITw = np.column_stack((np.eye(3), Tw))
Code: Select all
P = K @ Rot @ ITw
Folgendes für Punkte, die zur Z=0-Ebene in Weltkoordinaten gehören, erhalten wir eine Homographiematrix
Code: Select all
Hcalc = P[:,[0,1,3]]
Code: Select all
from scipy.spatial.transform import Rotation as R
pan = 10
tilt = -30
roll = 4
pan *= np.pi / 180
tilt *= np.pi / 180
roll *= np.pi / 180
r_pan = R.from_euler('Z', pan).as_matrix()
r_tilt = R.from_euler('X', tilt).as_matrix()
r_roll = R.from_euler('Z', roll).as_matrix()
Rot = r_roll @ r_tilt @ r_pan
Als Beispiel nehme ich f = 400 und Tw= [10 , -5 , 6 ] und einer Sammlung von Quellpunkten auf dem Boden gebe ich nur X- und Y-Koordinaten als Z = 0
an
Code: Select all
src_pts = np.array([
[ 0. , -7.62],
[ 0. , -6.35],
[ 0. , 0. ],
[ 0. , 1.27],
[ 0. , 2.54],
[ 0. , 3.81],
[20. , -7.62],
[20. , -6.35],
[20. , 0. ],
[20. , 1.27],
[20. , 2.54],
[20. , 3.81]])
und ich kann das überprüfen
Code: Select all
h10, status = cv2.findHomography(src_pts.reshape(-1,1,2), pts10.reshape(-1,1,2))
Als nächstes mache ich genau das Gleiche mit pan = 15°, um h15 und Pts15 zu berechnen
Wenn es für mich schwieriger wird!
Die Homographie von einem Bild zum anderen ist gegeben durch
h, status = cv2.findHomography(pts10.reshape(-1,1,2), pts15.reshape(-1,1,2))
Und ich erhalte
Code: Select all
H
Out[187]:
array([[ 9.97147963e-01, -7.56172873e-02, 1.73592176e+01],
[ 7.54846993e-02, 9.98090883e-01, 1.87521001e+00],
[-1.09070429e-04, -3.49361263e-06, 1.00000000e+00]])
Dann
Code: Select all
rot15 @ rot10.T / (rot15 @ rot10.T)[2,2]
Out[191]:
array([[ 0.99714794, -0.07561722, 0.04339806],
[ 0.0754847 , 0.9980909 , 0.00468803],
[-0.04362816, -0.00139744, 1. ]])
Anruf
Code: Select all
rotNorm = rot15 @ rot10.T / (rot15 @ rot10.T)[2,2]
Code: Select all
H[i,j] = RotNorm[i,j] for i,j < 2
Code: Select all
H[2,j] = RotNorm[2,j] / f for j < 2
Danke, dass Sie mich gelesen haben Bisher und ich hoffe, Sie können mir helfen.