Extraire l'homographie projective à partir de deux cartes de profondeur Kinect

étant donné deux nuages 3D point consécutifs 1 et 2 (pas l'ensemble du nuage, disons 100 points sélectionnés à partir du nuage avec GoodFeaturesToMatch D'OpenCV), obtenu à partir d'une carte Depthmap Kinect, je veux calculer l'homographie de la caméra de 1 à 2. Je comprends que c'est une transformation projective, et cela a déjà été fait par beaucoup de gens: <!-Ici (diapositive 12), ici (diapositive 30) et ici, dans ce qui semble être le classique papier. Mon problème est que tant que je suis programmeur compétent, je n'ai pas les compétences en maths ou trigonométrie pour transformer une de ces méthodes en code. Comme ce n'est pas un problème facile, j'offre une grande générosité pour le code qui résout le problème suivant:

la caméra est à l'origine, regardant dans la direction Z, au pentaèdre irrégulier [A,B,C,D,E, F]: camera position 1

la caméra se déplace-90mm vers la gauche (X), + 60mm vers le haut (Y), +50mm vers L'avant (Z) et tourne 5° vers le bas, 10° vers la droite et -3° dans le sens inverse: camera position 2

rotation de la scène entière de sorte que la caméra est de retour à sa position d'origine me permettre de déterminer la position des sommets à 2: enter image description here

les fichiers 3ds Max utilisés pour préparer ceci sont max 1, max 2 et max 3

Voici les positions des sommets avant et après, les intrinsèques, etc.: vertices and intrinsics

notez que les sommets de camera2 ne sont pas Précis à 100%, il y a un peu de bruit délibéré.

voici les nombres dans un fichier Excel

Le code que j'ai besoin, qui doit être facilement traduisibles en VB.Net ou C#, à l'aide EMGUCV et OpenCV le cas échéant, prend les 2 ensembles de sommets et la intrinsèques et produit la sortie suivante:

Camera 2 is at -90 X, +60 Y, +50 Z rotated -5 Y, 10 X, -3 Z.
The homography matrix to translate points in A to B is:
a1, a2, a3
b1, b2, b3
c1, c2, c3

je ne sais pas si l'homographie est 3X3 ou 3X4 pour coordonnées homogènes, mais il doit me permettre de traduire les sommets de 1 à 2.

je ne sais pas les valeurs a1, a2, etc; c'est ce que vous avez à trouver >;-)

l'offre de prime 500 'remplace' la prime que j'ai offerte àcette question très semblable, j'ai ajouté un commentaire soulignant à cette question.

EDIT2: je me demande si la façon dont je pose cette question Est trompeuse. Il me semble que le problème réside davantage dans l'ajustement point-nuage que dans la géométrie de la caméra (si vous savez traduire et faire tourner un B, vous savez la caméra transformer et vice-versa). Si oui, alors peut-être la solution pourrait-elle être obtenue avec L'algorithme de Kabsch ou quelque chose de similaire

15
demandé sur Community 2011-09-14 14:29:24

3 réponses

"l'algorithme" correct " à utiliser pour calculer la différence entre deux instantanés de nuages 2D ou 3D ponctuels est appelé ICP ( Point Itératif Le Plus Proche