Question

Hey geeks mathématiques, j'ai un problème qui a été me estompe pendant un certain temps maintenant. Il est pour un projet personnel.

J'ai trois points: rouge, vert et bleu. Ils sont positionnés sur un feuillet de carton de telle sorte que le point rouge est en bas à gauche (0,0), le point bleu est en bas à droite (1,0), et le point vert est en haut à gauche. Imaginez prendre du recul et de prendre une photo de la carte à partir d'un angle. Si vous deviez trouver le centre de chaque point dans l'image (disons les unités de pixels), comment voulez-vous trouver le vecteur normal du visage de la carte dans l'image (par rapport à la caméra)?

Maintenant quelques choses que j'ai ramassé sur ce problème:

  1. Les points (dans la « vraie vie ») sont toujours à angle droit. Sur la photo, ils sont seulement à angle droit si l'appareil a été tourné autour du point rouge le long d'un « axe » (axe étant la ligne créée par les points rouges et bleus ou rouge et vert).
  2. Il y a des points sur un seul côté de la carte. Ainsi, vous savez que vous ne serez jamais à la recherche à l'arrière de celui-ci.
  3. La distance de la carte à la caméra est hors de propos. Si je savais que la profondeur de chaque point, ce serait beaucoup plus facile (un simple produit croisé, non?).
  4. La rotation de la carte est sans rapport avec ce que je suis à la recherche. Dans le rafistolage que je l'ai fait pour essayer de comprendre cela, la rotation peut être trouvé avec l'aide du vecteur normal à la fin. Si oui ou non la rotation est une partie de (ou produit de) trouver le vecteur normal est inconnu pour moi.

L'espoir il y a quelqu'un là-bas qui est soit fait cela ou est un génie mathématique. J'ai deux de mes amis ici me aider et sur we've - jusqu'à présent -. SUCCOMBE

Était-ce utile?

La solution

Je l'ai travaillé dans mon ancienne version de Mathcad:

Edit: la capture d'écran mal Libellé de Mathcad: "connu: g et b sont perpendiculaire à l'autre"

Dans MathCAD j'ai oublié la dernière étape de faire la croix-produit, je vais copier-coller ici de ma réponse précédente:

  

Maintenant, nous avons résolu le X-Y-Z de la   traduit g et les points b, votre   question initiale voulait la normale   l'avion.

     

Si croix g x b , nous allons obtenir le   vecteur normal à la fois:

        | u1  u2  u3 |
g x b = | g1  g2  g3 |
        | b1  b2  b3 |  

      = (g2b3 - b2g3)u1 + (b1g3 - b3g1)u2 + (g1b2 - b1g2)u3
     

Toutes les valeurs sont connues, les brancher   (Je ne vais pas écrire la version avec g3   et b3 substitué en, car il est juste   trop long et laid pour être utile.

Mais en pratique, je pense que vous devrez résoudre numériquement, le réglage g z et b z afin de mieux répondre aux conditions suivantes:

  

g · b = 0

et

  

| g | = | b |

Étant donné que les pixels ne sont pas algébriquement parfait.

Exemple

En utilisant un tableau des Apollo 13 astronautes Gréement une de la place du module de commande de l'hydroxyde de lithium bidon pour travailler dans le LEM, i situés les coins:

les utilisant comme ma base d'un plan X-Y:

i enregistré les emplacements de pixels à l'aide de Photoshop, avec X positif à droite, et positive Y vers le bas (pour maintenir la règle droite de Z va " dans " l'image):

  

g = (79,5, -48,5, g z )

     

b = (-110,8, -62,8, b z )

estamper les deux formules de départ dans Excel, et en utilisant l'analyse toolpack à " minimiser " l'erreur en ajustant g z et b z , il est venu avec deux valeurs Z:

  

g = (79,5, -48,5, 102,5)

     

b = (-110,8, -62,8, 56,2)

Ce qui me permet alors calcuate d'autres valeurs intéressantes.

La longueur de g et b en pixels:

  

| g | = 138,5

     

| b | = 139,2

Le vecteur normal:

  

g x b = (3710, -15827, -10366)

L'unité normale (longueur 1):

  

u N = (0,1925, -0,8209, -0,5377)

Mise à l'échelle normale de même longueur (en pixels) comme g et b (138,9):

  

Normal = (26.7, -114,0, -74,7)

Maintenant que j'ai la normale qui est de la même longueur que g et b , je les tracés sur la même image:

Je pense que vous allez avoir un nouveau problème: la distorsion introduite par la lentille de la caméra. Les trois points ne sont pas parfaitement projetée sur le plan photographique deux dimensions. Il y a une distorsion sphérique qui fait fait des longueurs égales des lignes droites ne sont plus droites, plus égale, et rend les Normales légèrement de la normale.

recherche Microsoft a un algorithme pour figure sur la façon de corriger la distorsion de l'appareil photo:

Une nouvelle technique flexible pour l'étalonnage de l'appareil photo

Mais il est au-delà de moi:

  

Nous vous proposons une nouvelle technique flexible   calibrer facilement un appareil photo. C'est bien   adapté à une utilisation sans spécialisée   la connaissance de la géométrie 3D ou ordinateur   vision. La technique exige seulement   la caméra pour observer un motif plan   montré à quelques (au moins deux)   différentes orientations. soit le   l'appareil photo ou le motif plan peuvent être   librement déplacé. Le mouvement ne doit pas être   connu. déformation radiale de la lentille est   modélisé. La procédure proposée   est constitué d'une solution de forme fermée,   suivi d'un raffinement non linéaire   sur la base du maximum de vraisemblance   critère. La simulation informatique   et des données réelles ont été utilisées pour tester   la technique proposée, et très bon   résultats ont été obtenus. Par rapport   avec des techniques classiques qui utilisent   équipements coûteux tels que deux ou   trois plans orthogonaux, le projet   technique est facile à utiliser et flexible.   Il avance la vision par ordinateur 3D un   étape des environnements de laboratoire   utilisation réelle du monde.

Ils ont une image de l'échantillon, où vous pouvez voir la distorsion:


(source: microsoft.com )

Remarque

  • vous ne savez pas si vous voyez le « top » du carton, ou le « bas », de sorte que la normale pourrait être mis en miroir à la verticale (à savoir z = -Z)

Mise à jour

Guy a trouvé une erreur dans les formules algébriques dérivées. Fixation conduit à des formules que je, ne pense pas, une forme fermée simple. Ce n'est pas trop mal, car il ne peut pas être résolu exactement de toute façon; mais numériquement.

Voici une capture d'écran à partir d'Excel où je commence avec les deux règles knowns:

  

g · b = 0

et

  

| g | = | b |

L'écriture du 2ème comme une différence (une quantité « d'erreur »), vous pouvez ajouter à la fois et d'utiliser cette valeur comme un certain nombre d'avoir solveur d'Excel minimiser :

text alt

Cela signifie que vous devrez écrire votre propre solveur itératif numérique. Je regarde sur mon Méthodes numériques pour les ingénieurs manuel de l'université; Je sais qu'il contient des algorithmes pour résoudre des équations récursives sans forme fermée simple.

Autres conseils

A partir des sons de celui-ci, vous avez trois points p 1 , p 2 et p 3 définissant un plan et vous voulez trouver le vecteur normal au plan.

représentant les points en tant que vecteurs de l'origine, pour un vecteur normal serait
n = ( p 2 - p 1 ) x ( p 3 - p 1 )
(Où x est le produit croisé de deux vecteurs)

Si vous voulez que le vecteur pour pointer vers l'extérieur de la avant de la carte, puis ala la règle de droite, définissez
p 1 = rouge (en bas à gauche) dot
p 2 = bleu (en bas à droite) dot
p 3 = vert point (en haut à gauche)

@ Ian Boyd ... J'ai aimé votre explication, que je suis resté bloqué à l'étape 2, quand vous avez dit à résoudre pour b z . Vous aviez encore b z dans votre réponse, et je ne pense pas que vous devriez avoir b z dans votre répondre ...

b z doit être +/- racine carrée de g x 2 + g < sub> y 2 + g z 2 - b x 2 - b y 2

Après avoir fait moi-même, je l'ai trouvé très difficile de remplacer b z dans la première équation lorsque vous avez résolu pour g z , parce que quand la substitution b z , vous maintenant obtenir:

  

g z = - (g x b x + g y b y ) / sqrt (g x 2 + g y 2 + g z 2 - b x 2 - b y 2 )

La partie qui rend cette difficile est qu'il ya g z dans la racine carrée, de sorte que vous devez et séparer combiner les g z en même temps, et pour résoudre g z ce que je l'ai fait, que je ne pense pas que la façon dont je l'ai résolu était correct, parce que quand J'ai écrit mon programme pour calculer g z pour moi, je g x et g y valeurs pour voir si ma réponse correspondait avec le vôtre, et il ne l'a pas.

Alors je me demandais si vous pouviez me aider, parce que je vraiment besoin de cela pour travailler pour un de mes projets. Merci!

Il suffit de penser à mes pieds ici.

Vos entrées efficaces sont le rapport apparent RB / RG [+], l'angle apparent BRG, et l'angle que (par exemple) RB fait avec votre écran de coordonnées y axe (Ai-je raté quelque chose). Vous devez les composantes du vecteur normal normalisé (heh!), Que je crois est que deux valeurs indépendantes (bien que vous reste une ambiguïté avant-arrière si la carte est voir à travers). [++]

Alors je suppose que cela est possible ...

A partir de là, je travaille sur l'hypothèse que l'angle apparent de RB est toujours 0, et nous pouvons tourner la solution finale autour de l'axe z plus tard.

Commencez par la carte positionnée parallèlement au plan de visualisation et orienté de la manière « naturelle » (c.-à-vous supérieur par rapport à bas et à gauche par rapport à des affectations de droite sont respectés). Nous pouvons atteindre toutes les positions intéressantes de la carte en faisant tourner par \theta autour de l'axe x initial (pour -\pi/2 < \theta < \pi/2), puis par rotation autour de l'axe \phi y initial (pour -\pi/2 < \phi < \pi/2). Notez que nous avons conservé la direction apparente du vecteur RB.

Etape suivante calculer le ratio apparent et l'angle apparent après en termes de \theta et \phi et inverser le résultat. [+++]

La normale sera R_y(\phi)R_x(\theta)(0, 0, 1) pour R_i la matrice de rotation autour de l'axe primitif i.

[+] Les longueurs absolues ne comptent pas, parce que tout simplement vous indique la distance à la carte.

[++] Encore une hypothèse:. Que la distance de la carte pour voir avion est beaucoup plus grande que la taille de la carte

[+++] Ici, la projection que vous utilisez de l'espace de trois d pour les questions de plan d'observation. Ceci est la partie difficile, mais pas quelque chose que nous pouvons faire pour vous à moins que vous dites ce que la projection que vous utilisez. Si vous utilisez un véritable appareil photo, alors ceci est une projection en perspective et est couverte essentiellement un livre sur les graphiques 3D.

droite, le vecteur normal ne change pas par la distance, mais la projection du carton sur une photo Finalité Changement de distance (simple: Si vous avez un petit carton, rien ne change. Si vous avez un carton 1 mile de large et 1 mile de haut et vous faites pivoter de sorte qu'un côté est plus proche et l'autre côté plus loin, près du côté est magnifié et l'autre côté raccourci sur l'image. Vous pouvez voir que tout de suite qu'un rectangle ne reste pas un rectangle, mais un trapèze)

La façon la plupart du temps précis pour les petits angles et la caméra centrée sur le milieu consiste à mesurer le rapport de la largeur / hauteur entre l'image « normale » et l'image angle sur les lignes médianes (parce qu'ils ne sont pas déformés).

Nous définissons x comme gauche à droite, y en bas vers le haut, z comme de loin à proximité.

Ensuite
x = arcsin (measuredWidth / normWidth)
rouge-bleu y = arcsin (measuredHeight / normHeight)
rouge-vert z = sqrt (1,0-x ^ 2-y ^ 2)

Je vais calculer demain une solution plus exacte, mais je suis trop fatigué maintenant ...

Vous pouvez utiliser u, v, n co-oridnates. Réglez votre point de vue sur la position de l ' « œil » ou « appareil photo », puis traduire vos x, y, z les coordonnées u, v, n. De là, vous pouvez déterminer les Normales, ainsi que les surfaces en perspective et visibles si vous voulez (u «v », n '). Aussi, gardez à l'esprit que 2D = 3D avec z = 0. Enfin, assurez-vous d'utiliser les coordonnées homogenious.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top