Berechnen Sie die Homographie zwischen zwei Bildern, wenn die Kamera nur gedreht wirdPython

Python-Programme
Guest
 Berechnen Sie die Homographie zwischen zwei Bildern, wenn die Kamera nur gedreht wird

Post by Guest »

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

Code: Select all

K = np.diag([f, f, 1])
f ist die Brennweite der Kamera.
Die Position des Kamerazentrums in Weltraumkoordinaten

Code: Select all

Tw = np.array([tx, ty, tz])
wir bauen ITw

Code: Select all

ITw = np.column_stack((np.eye(3), Tw))
wir können die projektive Matrix berechnen

Code: Select all

P = K @ Rot @ ITw
wobei Rot eine 3x3-Rotationsmatrix ist
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]]
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

Code: Select all

H[i,j] = RotNorm[i,j] for i,j < 2
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.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post