2016-07-26 11 views
2

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) 
    

Antwort

0

Ihr Problem ist, dass Sie die Punkte aus dem Schachbrett verwenden: Sie nicht die Grundmatrix aus koplanaren Punkte abschätzen können. Eine Möglichkeit, dies zu beheben, besteht darin, Szenenpunkte mit einem generischen Ansatz wie SIFT oder SURF zu vergleichen. Die andere Möglichkeit besteht darin, die Essential-Matrix direkt mit dem 5-Punkt-Algorithmus zu berechnen, da die Essential-Matrix aus koplanaren Punkten berechnet werden kann.

Denken Sie auch daran, dass Sie die Kameraposition nur bis zur Skalierung aus der Essential-Matrix berechnen können. Mit anderen Worten, Ihre Übersetzung wird letztendlich ein Einheitsvektor sein. Eine Möglichkeit, den Skalierungsfaktor zu berechnen, um die tatsächliche Länge der Übersetzung zu erhalten, ist die Verwendung Ihres Schachbretts.

+0

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 –

+0

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. –

+0

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. –

Verwandte Themen