Um Ergebnisse der Zwei-Ansicht SFM-Ansatz zur Schätzung der Kamera Pose [R | t] zu validieren, habe ich die Schachbrettmuster, die ich für die Kalibrierung verwendet, insbesondere, dass "calibrateCamera" Funktion in OpenCV gibt Rotation und Translation Vektoren für jedes Muster zurück. Und daher, relative Pose zwischen, sagen wir, die ersten beiden Muster können leicht berechnet werden.falsche Kamera Pose von zwei Sicht SFM
Doch ich bekomme nicht die richtige Kamera-Pose, und ich habe so schwer gekämpft, das Problem herauszufinden, aber nicht umsonst.
Ich würde wirklich Ihre Beiträge schätzen, um mein Problem zu lösen.
MY CODE Beschreibung:
- undistort Bilder
- Suche Schachbrett Ecken in zwei Bilder
- Matchpunkte (verifiziert durch Seiten Auftragen der zwei Bilder und die Linien Seite)
- Schätzung Grundmatrix (verifiziert: x'T * F * x = 0)
- Essentielle Matrix (E) = KT * F * K (verifiziert: X'T * E * X = 0)
- SVD von E = U * S * VT
R = U * W * VT oder U * WT * VT so dass WT = [0, -1,0; 1,0,0; 0,0,1]
FundMat, mask = cv2.findFundamentalMat(imgpoints1, imgpoints2, cv2.FM_LMEDS) # is the fundamental matrix is really a fundamental Matrix. xFx'=0 ?? # verfication of fundamental matrix for i in range(len(imgpoints1)): X = np.array([imgpoints1[i][0],imgpoints1[i][1],1]) X_prime = np.array([imgpoints2[i][0],imgpoints2[i][1],1]) err = np.dot(np.dot(X_prime.T,FundMat),X) if mask[i] == True: print(err) # E = [t]R = (K_-T)_-1 * F * K = K_T*F*K term1 = np.dot(np.transpose(mtx), FundMat) # newcameramtx , mtx E = np.dot(term1, mtx) # newcameramtx , mtx # verfication of Essential matrix for i in range(len(imgpoints1)): X_norm = np.dot(np.linalg.inv(mtx), np.array([imgpoints1[i][0],imgpoints1[i][1],1]).T) X_prime_norm = np.dot(np.linalg.inv(mtx), np.array([imgpoints2[i][0],imgpoints2[i][1],1]).T) err_Ess = np.dot(np.dot(X_prime_norm.T,E),X_norm) if mask[i] == True: print(err_Ess) # SVD of E U,S,V_T = np.linalg.svd(E) # computation of Rotation and Translation without enforcement W = np.array([[0,-1,0],[1,0,0],[0,0,1]]) Rot1 = np.dot(np.dot(U, W), V_T) Rot2 = np.dot(np.dot(U, W.T), V_T)
Vielen Dank für Ihre Antwort! , Ich verglich zwischen den Drehungen, die von beiden Essential Matrix einmal durch 5-Punkt-Algorithmus "cv2.findEssentialMat" berechnet, und die andere ist Computer aus der Fundamental-Matrix. Ich fand heraus, dass beide mehr oder weniger ähnliche Rotationsmatrizen ergeben, sehr geringe Unterschiede. Nichtsdestotrotz passte keiner von ihnen zu der relativen Rotationsmatrix, aber es gab auch einen kleinen Unterschied und die gesamten Vorzeichen der Matrix waren invertiert. Nämlich Rot_from_E = - R_relative –
Ich hatte tatsächlich ein Problem mit der Konfiguration, dieser Algorithmus berechnet die Kamera-Pose unter der Annahme, dass sich die Kamera ändert, aber in meinem Fall änderte sich das Objekt. Daher sollte die relative Pose wie folgt berechnet werden: R_relativ = T1 * inv (T2), stattdessen: R_rel = inv (T2) * T1. Ich habe tatsächlich einen anderen Code gemacht, bei dem ich die Kamera modelliert habe und die Punkte und Posen angenommen habe, auch um nicht mit koplanarem Objekt zu arbeiten. und ich habe die Rotationsmatrix richtig gewählt. –
Eigentlich habe ich jetzt eine andere Sache ausprobiert. Ich entfernte die Bildverzerrung und die Essential-Matrix aus dem 5-Punkt-Algorithmus gab mir die genaue relative Pose. –