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