by Guest » 05 Jan 2025, 12:14
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
Code: Select all
ITw = np.column_stack((np.eye(3), Tw))
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
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
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
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]])
Ich kann Pts10 die Bildpunkte auf dem Bildschirm für diese Punkte mit Hcal berechnen
und ich kann das überprüfen
Code: Select all
h10, status = cv2.findHomography(src_pts.reshape(-1,1,2), pts10.reshape(-1,1,2))
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
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]])
Rot10 und rot15 als Rotationsmatrix für Schwenken = 10° bzw. 15° bezeichnen
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. ]])
Es zeigt, wie man H[0,0], H[0,1], H[1,0], H[1,1] berechnet
Anruf
Code: Select all
rotNorm = rot15 @ rot10.T / (rot15 @ rot10.T)[2,2]
wir haben
weiter
Code: Select all
H[2,j] = RotNorm[2,j] / f for j < 2
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.
[b]Die letzte Frage:[/b]
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?
[b]Theoretisch Hintergrund[/b]
Gegeben eine Kameramatrix
[code]K = np.diag([f, f, 1])
[/code]
f ist die Brennweite der Kamera.
Die Position des Kamerazentrums in Weltraumkoordinaten
[code]Tw = np.array([tx, ty, tz])
[/code]
wir bauen ITw
[code]ITw = np.column_stack((np.eye(3), Tw))
[/code]
wir können die projektive Matrix berechnen
[code]P = K @ Rot @ ITw
[/code]
wobei Rot eine 3x3-Rotationsmatrix ist
Folgendes für Punkte, die zur Z=0-Ebene in Weltkoordinaten gehören, erhalten wir eine Homographiematrix
[code]Hcalc = P[:,[0,1,3]]
[/code]
Rot ist definiert als
[code]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
[/code]
[b]Illustration mit einem Beispiel[/b]
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]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]])
[/code]
Ich kann Pts10 die Bildpunkte auf dem Bildschirm für diese Punkte mit Hcal berechnen
und ich kann das überprüfen
[code]h10, status = cv2.findHomography(src_pts.reshape(-1,1,2), pts10.reshape(-1,1,2))
[/code]
führt zum gleichen Wert
Als nächstes mache ich genau das Gleiche mit pan = 15°, um h15 und Pts15 zu berechnen
[b] Wenn es für mich schwieriger wird![/b]
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]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]])
[/code]
Rot10 und rot15 als Rotationsmatrix für Schwenken = 10° bzw. 15° bezeichnen
Dann
[code]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. ]])
[/code]
Es zeigt, wie man H[0,0], H[0,1], H[1,0], H[1,1] berechnet
Anruf
[code]rotNorm = rot15 @ rot10.T / (rot15 @ rot10.T)[2,2]
[/code]
wir haben
[code]H[i,j] = RotNorm[i,j] for i,j < 2
[/code]
weiter
[code]H[2,j] = RotNorm[2,j] / f for j < 2
[/code]
[b]aber was ist mit H[0,2] und H[1,2] ?[/b]
Danke, dass Sie mich gelesen haben Bisher und ich hoffe, Sie können mir helfen.