Berechnen Sie die Homographie zwischen zwei Bildern, wenn die Kamera nur gedreht wird
Posted: 05 Jan 2025, 16:25
Die letzte Frage:
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
f ist die Brennweite der Kamera.
Die Position des Kamerazentrums in Weltraumkoordinaten
wir bauen ITw
wir können die projektive Matrix berechnen
wobei Rot eine 3x3-Rotationsmatrix ist
Folgendes für Punkte, die zur Z=0-Ebene in Weltkoordinaten gehören, erhalten wir eine Homographiematrix
Rot ist definiert als
Illustration mit einem Beispiel
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
Ich kann Pts10 die Bildpunkte auf dem Bildschirm für diese Punkte mit Hcal berechnen
und ich kann das überprüfen
führt zum gleichen Wert
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
Rot10 und rot15 als Rotationsmatrix für Schwenken = 10° bzw. 15° bezeichnen
Dann
Es zeigt, wie man H[0,0], H[0,1], H[1,0], H[1,1] berechnet
Anruf
wir haben
weiter
aber was ist mit H[0,2] und H[1,2] ?
Danke, dass Sie mich gelesen haben Bisher und ich hoffe, Sie können mir helfen.
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.