Bonne façon de extrait de la Traduction de l'Essentiel de la Matrice par SVD
J'ai calibré mon appareil photo et a trouvé les paramètres intrinsèques(K). J'ai également calculé la Matrice Fondamentale (F).
Maintenant E= K_T* F * K . So far So good.
Maintenant, nous passons l'Essentiel de la Matrice(E) à la SVD d'utiliser la décomposition en valeurs (U,W,V) pour extraire la Rotation et la Translation:
essentialMatrix = K.Transpose().Mul(fund).Mul(K);
CvInvoke.cvSVD(essentialMatrix, wMatrix, uMatrix, vMatrix, Emgu.CV.CvEnum.SVD_TYPE.CV_SVD_DEFAULT);
** Question) À ce moment, deux méthodes ont été proposées, et il l'a confondu moi qui on vraiment donner la bonne réponse, - en particulier pour la Traduction:
À première méthode entrez description du lien ici l'auteur suggère de calculer le R,T comme suit:
Mais dans la Deuxième méthode [http://isit.u-clermont1.fr/~ab/Classes/DIKU-3DCV2/Documents/Lecture16.pdf] l'auteur propose une autre formule pour T +U , -U comme indiqué ci-dessous:
Je suis la mise en œuvre de ce sur C# .Net en utilisant openCv bibliothèques. Quelqu'un sait où la Traduction de la Formule est la bonne?
OriginalL'auteur farzin parsa | 2013-04-11
Vous devez vous connecter pour publier un commentaire.
la première, la solution de la matrice de la représentation de la croix du produit avec le vecteur t (donc la première solution = [t]x ), tandis que la deuxième solution montre juste le vecteur de translation t (https://en.wikipedia.org/wiki/Essential_matrix).
La définition de [t]x est:
(à partir de http://gandalf-library.sourceforge.net/tutorial/report/img148.png)
si vous extrait de la traduction avec SVD, le vecteur de translation est
SVD(E).u.col(2)
, comme il est décrit dans la deuxième méthode de votre post. comment voulez-vous extraire de votre 3x3 traduction de la matrice? vous pouvez également regarder les stackoverflow.com/questions/16639106/... pour plus d'informationsJ'ai utilisé la 1ère méthode mentionnée ci-dessus pour extraire T1,T2 soit 3X3. Suis-je en train de faire quelque chose de mal? Dans le lien fourni, encore une fois, le gars a sauté de calcul de t1,t2 à t sans parler de la conversion/relation entre t1,t2 et t que je rappelle ci-dessous: t1 = decomp.u.le col(2); //u3 t2 = -decomp.u.le col(2); //u3 new_pos = old_pos + -R. t()*t;
puisque vous utilisez SVD, votre vecteur de translation (3x1) est la 3ème colonne de U (
decomp.u.col(2)
renvoie une 3x1 vecteur). en utilisant SVD, vous obtenez 4 solutions possibles, 2 pourR
et 2 pourt
. pour obtenir la bonne solution à la fois, vous pouvez utiliser la triangulation. si vous lisez l'autre question attentivement, vous verrez qu'entre t1\t2 = decomp.u.le col(2); " etnew_pos = old_pos + -R.t()*t;
la triangulation est fait (lien fourni dans d'autres question). Lire aussi les commentaires, ce qui indique une erreur dans le calcul SVDOriginalL'auteur 3x14159265