2016-07-26 3 views
2

Afin de valider les résultats de l'approche SFM à deux vues pour l'estimation de la pose de caméra [R | t], j'ai utilisé les modèles d'échiquiers que j'ai utilisés pour l'étalonnage. La fonction dans OpenCV retourne des vecteurs de rotation et de translation pour chaque motif. Et par conséquent, la pose relative entre disons que les deux premiers modèles peuvent être calculés facilement. Mais je n'ai pas la bonne posture d'appareil photo, et j'ai eu du mal à trouver le problème, mais rien de vain.mauvaise pose de caméra à partir de deux vues SFM

J'apprécierais vraiment vos contributions pour résoudre mon problème.

MON Code Description:

  • images undistort
  • coins de l'échiquier Rechercher dans deux images
  • points de match (vérifié par traçage côté à l'autre les deux images et les lignes)
  • estimation matrice fondamentale (vérifiée: x'T * F * x = 0)
  • Matrice essentielle (E) = KT * F * K (vérifiée: X'T * E * X = 0)
  • SVD de E = U * S * VT
  • R = U * W * VT ou U * WT * VT tel que 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) 
    

Répondre

0

Votre problème est que vous utilisez des points de l'échiquier: vous ne pouvez pas estimer la matrice fondamentale des points coplanaires. Une façon de résoudre ce problème est de faire correspondre les points de la scène en utilisant une approche générique, comme SIFT ou SURF. L'autre méthode consiste à estimer directement la matrice essentielle à l'aide de l'algorithme à 5 points, car la matrice essentielle peut être calculée à partir de points coplanaires. De plus, gardez à l'esprit que vous pouvez uniquement calculer la position de la caméra à l'échelle à partir de la matrice Essential. En d'autres termes, votre traduction finira par être un vecteur unitaire. Une façon de calculer le facteur d'échelle pour obtenir la longueur réelle de la traduction est d'utiliser votre échiquier.

+0

Merci beaucoup pour votre réponse! , J'ai comparé entre les rotations qui résultaient à la fois de la matrice essentielle calculée une fois par l'algorithme de 5 points "cv2.findEssentialMat", et l'autre est l'ordinateur de la matrice fondamentale. J'ai découvert que les deux donnent des matrices de rotation plus ou moins similaires, de très légères différences. mais néanmoins, aucun d'eux ne correspondait à la matrice de rotation relative, mais il y avait cependant aussi une légère différence et les signes entiers de la matrice étaient inversés. A savoir Rot_from_E = - R_relative –

+0

J'ai en fait eu un problème avec la configuration, cet algorithme calcule la pose de la caméra en supposant que la caméra change, mais dans mon cas l'objet changeait. donc la pose relative doit être calculée comme suit, R_relative = T1 * inv (T2), à la place: R_rel = inv (T2) * T1. J'ai en fait fait un autre code où j'ai modélisé la caméra et assumé les points et les poses, aussi pour être loin de travailler avec un objet coplanaire. et j'ai eu la matrice de rotation juste. –

+0

En fait, maintenant j'ai essayé une autre chose. J'ai supprimé la distorsion de l'image et la matrice Essentielle de l'algorithme à 5 points m'a donné la pose relative exacte. –