2015-08-24 1 views
1

J'utilise actuellement OpenCV pour un travail lié estimation de la pose, dans laquelle je Triangulation des points entre les paires pour l'estimation de la reconstruction et le facteur d'échelle. J'ai rencontré un problème étrange en travaillant dessus, particulièrement dans les fonctions d'opencv recoverPose() et triangulatePoints().problème étrange avec triangulation stéréo: deux solutions valides

Dire que j'ai caméras 1 et 2, espacés dans X, avec CAM1 à (0,0,0) et cam2 à la droite de celui-ci (X positif). J'ai deux tableaux points1 et points2 qui sont les caractéristiques appariées entre les deux images. Selon la documentation et le code OpenCV, j'ai noté deux points:

  1. recoverPose() suppose que les points1 appartiennent à la caméra à (0,0,0).
  2. triangulatePoints() est appelée deux fois: l'une de recoverPose() pour nous dire lequel des quatre combinaisons de R/t est valide, puis à nouveau de mon code et la documentation dit:

    cv::triangulatePoints(P1, P2, points1, points2, points3D) : points1 -> P1 and points2 -> P2. 
    

Par conséquent, comme dans le cas de recoverPose(), il est sûr de supposer que P1 est [I | 0] et P2 est [R | t].

Ce que j'ai réellement trouvé: Cela ne fonctionne pas de cette façon. Bien que mon camera1 est à 0,0,0 et camera2 est à 1,0,0 (1 étant à l'échelle), la seule configuration correcte est obtenue si je lance

recoverPose(E, points2, points1...) 
triangulatePoints([I|0], [R|t], points2, points1, pts3D) 

qui devrait être incorrect, parce que points2 est l'ensemble de R | t, pas de points1. J'ai testé une paire d'images d'une scène dans ma chambre où il y a trois objets visibles après la triangulation: un moniteur et deux affiches sur le mur derrière. Voici les nuages ​​de points résultant de la triangulation (excusez le MS Paint)

Si je fais le chemin prescrit de OpenCV: (points d'affiches dispersées dans l'espace, bizarre résultat à la recherche)

Wrong

Si je faire ma (mauvaise?) façon:

Correct

Quelqu'un peut-il partager leurs points de vue sur ce qui se passe ici? Techniquement, les deux solutions sont valides car tous les points tombent devant les deux caméras: et je ne savais pas quoi choisir avant de l'avoir rendu comme un nuage de points. Est-ce que je fais quelque chose de mal ou est-ce une erreur dans la documentation? Je ne connais pas la théorie de la vision par ordinateur, alors il est possible que je manque quelque chose de fondamental ici. Merci pour votre temps!

+0

Avez-vous déjà trouvé cela? Quelle version (exactement) d'OpenCV utilisez-vous? –

+0

Honnêtement, non. Je suis juste allé avec la méthode qui a donné les bons résultats. J'utilise 2.4.11 en C++. – HighVoltage

Répondre

1

J'ai rencontré un problème similaire. Je crois qu'OpenCV définit le vecteur de traduction à l'opposé de ce à quoi on pourrait s'attendre. Avec la configuration de votre caméra, le vecteur de traduction serait [-1, 0, 0]. C'est contre-intuitif, mais à la fois RecoverPose et stereoCalibrate donnent ce vecteur de traduction. J'ai trouvé que lorsque j'utilisais le vecteur de traduction incorrect mais intuitif (par exemple [1, 0, 0]) je ne pouvais pas obtenir de résultats corrects à moins d'avoir échangé points1 et points2, comme vous l'avez fait.

Je soupçonne que le vecteur de translation traduire en réalité des points dans l'autre système de coordonnées caméra, pas le vecteur de traduire les poses de la caméra.Le OpenCV Documentation, semble impliquer que ce soit le cas:

La matrice rotation-translation commune [R | t] est appelée une matrice de paramètres extrinsèques. Il est utilisé pour décrire le mouvement de la caméra autour d'une scène statique, ou vice versa, le mouvement rigide d'un objet devant un appareil photo. Autrement dit, [R | t] traduit les coordonnées d'un point (X, Y, Z) en un système de coordonnées, fixe par rapport à la caméra.

Wikipedia a une belle description sur Translation of Axis:

Dans le nouveau système de coordonnées, le point P apparaît avoir été traduit dans le sens opposé. Par exemple, si le système xy est traduit par une distance h vers la droite et une distance k vers le haut, alors P apparaîtra avoir été traduit par une distance h vers la gauche et une distance k vers le bas dans le système x'y'