4 votes

Trouver la rotation optimisée

J'ai une application où je dois trouver une rotation à partir d'un ensemble de 15 points 3D ordonnés&indexés (X1, X2, ..., X15) vers un autre ensemble de 15 points avec le même indice (1 point initial correspondant à 1 point final).

J'ai lu beaucoup de choses sur la recherche de la rotation avec les angles d'Euler (mauvais pour certaines personnes), les quaternions ou en projetant le vecteur sur l'axe de base. Mais j'ai une contrainte supplémentaire : quelques points de mon ensemble final peuvent être erronés (i.e. avoir de mauvaises coordonnées) donc je veux discriminer les points qui demandent une rotation très éloignée de la rotation médiane.

Mon problème est le suivant : pour chaque ensemble de 3 points (non alignés) et leurs images, je peux calculer des quaternions (étant donné que la matrice de transformation ne sera pas une rotation pure, j'ai quelques calculs supplémentaires à faire mais c'est faisable). J'obtiens donc un ensemble de quaternions (455 maximum) et je veux enlever les mauvais.

Existe-t-il un moyen de trouver les points qui donnent des rotations éloignées de la rotation moyenne ? La "moyenne" et "l'écart-type" ont-ils une signification pour les quaternions ou dois-je calculer les angles d'Euler ? Et une fois que j'ai l'ensemble des "bons" quaternions, comment puis-je calculer la "moyenne" des quaternions/rotations ?

A la vôtre,

Ricola3D

4voto

comingstorm Points 11392

Il y a deux problèmes ici :

  • comment calculer un "meilleur ajustement" pour un nombre arbitraire de points ?
  • comment décider des points à accepter et des points à rejeter ?

La réponse générale à la première question est la suivante : " faites un test de dépistage ". moindres carrés s'adapter". Les quaternions seraient probablement meilleurs que les angles d'Euler pour cela ; essayez ce qui suit :

foreach point pair (a -> b), ideal rotation by unit quaternion q is:
   b = q a q*   ->   q a - b q = 0

Donc, on cherche un ajustement par les moindres carrés pour q :

minimize sum[over i] of |q a_i - b_i q|^2
under the constraint:  |q|^2 = 1

Comme présenté ci-dessus, le problème des moindres carrés est linéaire à l'exception de la contrainte, ce qui devrait le rendre plus facile à résoudre qu'une formulation par angle d'Euler.


Pour le second problème, je vois deux approches :

  • si vos points ne sont pas trop éloignés les uns des autres, vous pourriez essayer d'exécuter le solveur des moindres carrés avec tous les points, puis revenir en arrière, éliminer les "aberrations" (les paires de points dont l'erreur au carré est la plus grande), et réessayer.
  • si des points très incohérents perturbent la procédure ci-dessus, vous pouvez essayer de sélectionner de petits sous-ensembles aléatoires de 3 ou 4 paires, et trouver un ajustement par la méthode des moindres carrés pour chacun d'entre eux. Si un grand groupe de ces résultats présente des rotations similaires avec une erreur totale faible, vous pouvez l'utiliser pour identifier les "bonnes" paires (et ainsi éliminer les mauvaises paires) ; puis revenir en arrière et trouver un ajustement des moindres carrés pour toutes les bonnes paires.

4voto

JCooper Points 3700

En vision par ordinateur, il y a une technique appelée RANSAC pour faire quelque chose comme ce que vous proposez. Au lieu de trouver tous les quaternions possibles, vous utiliseriez un ensemble minimal de correspondances de points pour trouver une seule matrice de quaternion/transformation. Vous évaluerez ensuite la qualité de l'ajustement de tous les points, en éliminant ceux qui ne correspondent pas assez bien. Si vous n'avez pas assez de bonnes correspondances, vous avez peut-être obtenu une mauvaise correspondance dans votre ensemble initial. Vous allez donc rejeter cette tentative et réessayer. Si vous obtenez suffisamment de bonnes correspondances, vous effectuerez un ajustement par régression des moindres carrés de tous les points aberrants pour obtenir une nouvelle matrice de transformation, puis vous itérerez jusqu'à ce que vous soyez satisfait des résultats.

Vous pouvez également prendre tous vos quaternions normalisés et trouver le produit scalaire entre eux. Le produit scalaire doit toujours être positif ; s'il ne l'est pas pour un calcul donné, vous devez annuler toutes les composantes de l'un des deux quaternions et refaire le calcul. Vous disposez alors d'une mesure de la distance entre les quaternions et vous pouvez les regrouper ou rechercher des écarts.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X