Pregunta

Hola, expertos en matemáticas, tengo un problema que me ha estado desconcertando desde hace un tiempo.Es para un proyecto personal.

Tengo tres puntos:rojo, verde y azul.Están colocados en un trozo de cartón de modo que el punto rojo esté en la parte inferior izquierda (0,0), el punto azul esté en la parte inferior derecha (1,0) y el punto verde esté en la parte superior izquierda.Imagínese dar un paso atrás y tomar una fotografía de la tarjeta desde un ángulo.Si tuvieras que encontrar el centro de cada punto en la imagen (digamos que las unidades son píxeles), ¿cómo encontrarías el vector normal de la cara de la tarjeta en la imagen (en relación con la cámara)?

Ahora algunas cosas que he aprendido sobre este problema:

  1. Los puntos (en la "vida real") siempre están en ángulo recto.En la imagen, solo están en ángulo recto si la cámara se ha girado alrededor del punto rojo a lo largo de un "eje" (el eje es la línea creada por los puntos rojo y azul o rojo y verde).
  2. Hay puntos en un solo lado de la tarjeta.Por lo tanto, sabrá que nunca mirará la parte posterior.
  3. La distancia de la tarjeta a la cámara es irrelevante.Si supiera la profundidad de cada punto, esto sería mucho más fácil (solo un simple producto cruzado, ¿no?).
  4. La rotación de la tarjeta es irrelevante para lo que busco.En los retoques que he estado haciendo para tratar de resolver esto, al final la rotación se puede encontrar con la ayuda del vector normal.No conozco si la rotación es parte (o producto) de encontrar el vector normal.

Espero que haya alguien por ahí que haya hecho esto o que sea un genio de las matemáticas.Tengo a dos de mis amigos aquí ayudándome y, hasta ahora, no hemos tenido éxito.

¿Fue útil?

Solución

he trabajado a cabo en mi versión antigua de Mathcad:

alt text

Edit: Wording mal en captura de pantalla de MathCAD: "conocido: g y b son perpendicular entre sí"

en Mathcad se me olvidó el último paso de hacer el producto cruzado, que voy a copiar y pegar aquí de mi respuesta anterior:

  

Ahora hemos resuelto para el X-Y-Z de la   g traducida y los puntos B, su   pregunta original quería que el normal de   el avión.

     

Si cruz g x b , que obtendrá el   vector normal a ambos:

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

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

Todos los valores son conocidos, enchufarlos en   (No voy a escribir la versión con g3   y b3 sustituido en el, ya que es sólo   demasiado largo y feo para ser útil.

Sin embargo, en términos prácticos, creo que tendrá que resolver numéricamente, el ajuste g z y b z con el fin de adaptarse mejor a las condiciones:

  

g · b = 0

y

  

| g | = | b |

Dado que los píxeles no son algebraicamente perfecto.

Ejemplo

El uso de una imagen de los astronautas de Apollo 13 que aparejan una de plaza de hidróxido de litio bote del módulo de comando para trabajar en el LEM, localicé las esquinas:

alt text

El uso de ellos como mi base de un plano X-Y:

alt text

grabé las ubicaciones de píxeles usando Photoshop, con X positivo hacia la derecha, y positivo Y abajo (para mantener la regla de la mano derecha de Z va " en " la imagen):

  

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

     

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

Punzonado las dos fórmulas de partida en Excel, y utilizando el paquete de herramientas de análisis a " minimizar " el error mediante el ajuste de g z y b z , que subió con dos valores Z:

  

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

     

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

Lo que entonces me permite calcuate otros valores interesantes.

La longitud de g y b en píxeles:

  

| g | = 138,5

     

| b | = 139,2

El vector normal:

  

g x b = (3,710, -15827, -10366)

La unidad normal (longitud 1):

  

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

Escalado normal a misma longitud (en píxeles) como g y b (138,9):

  

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

Ahora que tengo la normal que es la misma longitud que g y b , i ellos representan en el mismo cuadro:

alt text

creo que vamos a tener un nuevo problema: la distorsión introducida por la lente de la cámara. Los tres puntos no están perfectamente proyectan en el plano fotográfica de 2 dimensiones. Hay una distorsión esférica que hace que las líneas rectas ya no recta, hace longitudes iguales ya no iguales, y hace que las normales ligeramente fuera de lo normal.

Las investigaciones de Microsoft tiene un algoritmo para figure la manera de corregir la distorsión de la cámara:

Una nueva técnica flexible para Calibración de la cámara

Pero es más allá de mí:

  

Se propone una nueva técnica flexible para   calibrar fácilmente una cámara. Está bien   adecuado para su uso sin especializado   conocimiento de la geometría en 3D o un ordenador   visión. La técnica sólo requiere   la cámara para observar un patrón planar   mostrado a algunos (al menos dos)   diferentes orientaciones. O bien el   cámara o el patrón puede ser plana   libremente movido. El movimiento no tiene que ser   conocido. distorsión de la lente radial es   modelado. El procedimiento propuesto   se compone de una solución de forma cerrada,   seguido de un refinamiento no lineal   basado en la máxima verosimilitud   criterio. Tanto la simulación por ordenador   y los datos reales se han utilizado para poner a prueba   la técnica propuesta, y muy bueno   Se han obtenido resultados. Comparado   con técnicas clásicas que utilizan   equipos caros tales como dos o   tres planos ortogonales, la propuesta   técnica es fácil de usar y flexible.   Que avanza la visión por ordenador en 3D uno   paso de entornos de laboratorio para   verdadera uso en el mundo.

Tienen una imagen de muestra, donde se puede ver la distorsión:

alt text
(fuente: microsoft.com )

Nota:

  • no se sabe si está viendo el "top" del cartón, o el "fondo", por lo que el normal podría ser reflejado verticalmente (es decir z = -z)

Actualizar

Galán encuentra un error en las fórmulas algebraicas derivadas. La fijación se lleva a fórmulas que yo, no creo, tener una forma cerrada simple. Esto no es tan malo, ya que no se puede resolver con exactitud todos modos; pero numéricamente.

Aquí hay una captura de pantalla de Excel dónde empiezo con los datos conocidos dos reglas:

  

g · b = 0

y

  

| g | = | b |

Escribir el segundo uno como una diferencia (una cantidad de "error"), a continuación, puede añadir tanto hacia arriba y utilizar este valor como un número tener solucionador de Excel minimizar

text alt

Esto significa que tendrá que escribir su propio solver iterativo numérico. estoy mirando por encima de mi Métodos Numéricos para Ingenieros libro de texto de la universidad; Sé que contiene algoritmos para resolver ecuaciones recursivas sin forma cerrada simple.

Otros consejos

A partir de los sonidos de la misma, que tienen tres puntos p 1 , p 2 y p 3 que define un plano, y quiere encontrar el vector normal al plano.

En representación de los puntos como vectores desde el origen, para un vector normal serían
n = ( p 2 - p 1 ) x ( p 3 - p 1 )
(Donde x es el producto cruzado de los dos vectores)

Si desea que el vector se apunte hacia el exterior desde la parte frontal de la tarjeta, y luego ala la regla de la mano derecha, ajuste
p 1 = rojo (inferior izquierda) dot
p 2 = azul (inferior derecha) dot
p 3 = verde (superior izquierda) dot

@ Ian Boyd ... me ha gustado tu explicación, solamente me quedé atrapado en el paso 2, cuando dijiste a resolver para b z . Que todavía tenía b z en su respuesta, y no creo que usted debe tener b z en su responder ...

b z debe ser +/- raíz cuadrada de g x 2 + g < sub> y 2 + g z 2 - b x 2 - b y 2

Después de que hice esto mismo, he encontrado que es muy difícil de sustituir b z en la primera ecuación cuando se resuelve para g z , porque cuando la sustitución b z , que ahora se obtendría:

  

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 parte que hace que esto sea difícil es que hay g z en la raíz cuadrada, así que hay que separar y combinar el g z juntos, y resolver para g z lo cual hice, sólo que no creo que la forma en que lo resolví era correcta, porque cuando escribí mi programa para calcular g z para mí, utilicé su g x y g y los valores para ver si mi respuesta coincide con la suya, y no lo hizo.

Así que me preguntaba si me podría ayudar, porque realmente necesito para conseguir que esto funcione para uno de mis proyectos. Gracias!

Solo estoy pensando en mis pies aquí.

Sus entradas efectivas son la relación aparente RB/RG [+], el ángulo aparente BRG y el ángulo que (digamos) RB forma con el eje y de coordenadas de su pantalla (¿me perdí algo?).Necesitas los componentes del vector normal normalizado (¡je!), que creo que son solo dos valores independientes (aunque te queda una ambigüedad anverso-reverso si la tarjeta es transparente).[++]

Así que supongo que esto es posible...

De ahora en adelante, trabajo bajo el supuesto de que el ángulo aparente de RB es siempre 0, y que luego podemos rotar la solución final alrededor del eje z.

Comience con la tarjeta colocada paralela al plano de visión y orientada de forma "natural" (es decir,tu superior vs.abajo e izquierda vs.se respetan las asignaciones correctas).Podemos alcanzar todas las posiciones interesantes de la tarjeta girando por \theta alrededor del eje x inicial (para -\pi/2 < \theta < \pi/2), luego girando por \phi alrededor del eje y inicial (para -\pi/2 < \phi < \pi/2).Tenga en cuenta que hemos conservado la dirección aparente del vector RB.

El siguiente paso calcula la relación aparente y el ángulo aparente después en términos de \theta y \phi e invertir el resultado.[+++]

lo normal sera R_y(\phi)R_x(\theta)(0, 0, 1) para R_i la matriz de rotación primitiva alrededor del eje i.

[+] Las longitudes absolutas no cuentan, porque eso solo te indica la distancia a la tarjeta.

[++] Una suposición más:que la distancia desde la tarjeta al plano de visión es mucho mayor que el tamaño de la tarjeta.

[+++] Aquí importa la proyección que utilices desde el espacio tridimensional al plano de visión.Esta es la parte difícil, pero no es algo que podamos hacer por usted a menos que diga qué proyección está utilizando.Si está utilizando una cámara real, entonces se trata de una proyección en perspectiva y se trata prácticamente en cualquier libro sobre gráficos 3D.

derecha, el vector normal no cambia por la distancia, pero la proyección de la cartulina en una imagen hace el cambio de la distancia (simple: Si usted tiene un pequeño cartón, nada cambia. Si usted tiene un cartón de 1 milla de ancho y 1 milla de altura y se gira de manera que un lado está más cerca y el otro lado más lejano, el lado cercano se magnifica y se acorta el otro lado de la imagen. Se puede ver que de inmediato que un rectángulo no se queda un rectángulo, pero un trapecio)

La forma mayormente precisa para ángulos pequeños y la cámara centrada en el medio es medir la relación de la anchura / altura entre "normal" de imagen y ángulo de la imagen en las líneas intermedias (porque no son deformado).

Se define como x izquierda a derecha, y tan abajo hacia arriba, z como de lejos a cerca.

A continuación,
x = arc sen (measuredWidth / normWidth) rojo-azul
y = arcsin (measuredHeight / normHeight) rojo-verde
z = sqrt (1,0-x ^ 2-y ^ 2)

calcularé mañana una solución más exacta, pero estoy demasiado cansado ahora ...

Se puede usar u, v, n co-oridnates. Establecer su punto de vista a la posición del "ojo" o "cámara", luego traducir sus x, y, z las coordenadas de u, v, n. Desde allí se puede determinar las normales, así como las superficies visibles en perspectiva y si lo desea (u 'v', n '). Además, tenga en cuenta que en 2D = 3D con z = 0. Por último, asegúrese de usar homogenious coordenadas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top