Esta página está en construcción: perdonen los errores, repeticiones y temas inacabados. This page is being developed: I am sorry for errors, duplications and unfinished subjects. Reunir imágenes. Estrategias V. Simulación Aproximación por micropasos II (incluido en Danzante) Ante el éxito de este acercamiento puntual, desarrollado en Aproximación por micropasos I, abordamos el siguiente paso, que es, naturalmente, dejar que un sencillo algoritmo decida cuál es la dirección, espacial, circular, que nos acerca más deprisa al esqueleto incógnita. La cosa es simple: probamos con las seis y elegimos la mayor, es decir, la que disminuye más deprisa la distancia (por ahora lineal) a ese objetivo. Por el momento se trata de visualizar y comprender lo que está pasando, un proceso convenientemente lento. Más adelante, suprimimos la representación y establecemos una política de pasos grandes, decreciendo cuando nos acercamos al objetivo. En el siguiente vídeo se contempla el proceso, y se comenta. Reunión de dos esqueletos de la misma persona en dos cámaras. Algoritmo automático por microsaltos-clip0003.aviEl algoritmo es simple. Se basa en
0. Disponemos ya de un esqueleto de partida con el que inicializamos el móvil. 0'. Elegimos el ángulo diferencial de los cuaterniones elementales (6) de giros. 1. Elegir esqueleto incógnita. 2. Determinar el acercamiento óptimo (más rápido) 3. Girar (transformar) el esqueleto móvil con el cuaternión y matriz correspondientes a esa dirección. 4. Continuar con el ciclo 2-3 hasta llegar a una distancia aceptable, arbitrariamente elegida.______________________________________________________________________________________________________________________________
Public Function reune_por_microaproximaciones(ByVal pseudoskel_orig() As Point4D, ByVal pseudoskel_incog() As Point4D) As Double
Dim veces As Integer = 0
Dim pseudoskel0_1 = pseudoskel_orig
Dim distas As Double = 1000 '10 metros
While distas > 1 And veces < 1000 '8cm
'elige la mejor
Dim quater = elige_el_mayor_gradiente(pseudoskel0_1, pseudoskel_incog)
pseudoskel0_1 = realiza_una_microaproximacion(pseudoskel0_1, quater, pseudoskel_incog)
distas = 100 * distancia_pseudoskel(pseudoskel0_1, pseudoskel_incog)
veces = veces + 1
End While
Return distas
End Function
______________________________________________________________________________________________________________________________
Esta función encuentra la dirección del acercamiento óptimo:
______________________________________________________________________________________________________________________________
Public Function elige_el_mayor_gradiente(ByVal pseudoskel0_1() As Point4D, _
ByVal pseudoskel_incognita() As Point4D) As Quaternion
'6 direcciones: 1
'VA BIEN
Dim matriz_inter As Matrix3D, cuaternion_inter As Quaternion
Dim distas, distas0 As Double: Dim distancias(6) As Double: Dim quater_grad(6) As Quaternion
If pseudoskel0_1 Is Nothing Or pseudoskel_incognita Is Nothing Then _
adosa_texto("Esqueleto actual o Incognita no seleccionados")
call inicializa microsaltos(salto) 'sólo al cambiar el salto
Dim quater As Quaternion: distas = 100 * distancia_pseudoskel(pseudoskel0_1, pseudoskel_incognita): distancias(0) = distas
Dim pseudoskel_prueba(20) As Point4D
For qq = 1 To 6
matriz_inter = Matrix3D.Identity '.Rotate(quaternion3dimen)
matriz_inter.Rotate(quater_grad(qq))
'no se debe modificar pskel 0_1
pseudoskel_prueba = transforma_pseudoesqueleto(pseudoskel0_1, 2, matriz_inter, quater_grad(qq), 0)
distas = 100 * distancia_pseudoskel(pseudoskel_prueba, pseudoskel_incognita)
distancias(qq) = distancias(0) - distas 'incremento ha de ser grande
Next
Dim incre_max As Double = -10000
Dim caso_max As Byte
For qq = 1 To 6
If distancias(qq) > incre_max Then incre_max = distancias(qq) : caso_max = qq
Next
'¡'ya se sabe cual es la buena
Return quater_grad(caso_max)
End Function
______________________________________________________________________________________________________________________________
sub inicializa microsaltos(salto)
'esto puede hacerse antes, al inicializar, no repetir cada vez
', hay que repetir tambian al cambiar el tamaño de salto
' Case 23 ' <‒- ←
quater = CuaterBusca1: quater.Invert(): quater_grad(1) = quater
quater = CuaterBusca1: quater_grad(2) = quater
quater = CuaterBusca2: quater.Invert(): quater_grad(3) = quater
quater = CuaterBusca2: quater_grad(4) = quater
quater = CuaterBusca3: quater.Invert(): quater_grad(5) = quater
quater = CuaterBusca3: quater_grad(6) = quater:
end sub
'....⌠⌡┌ ┐└ ┘∩∫ↄↃ₍₎
______________________________________________________________________________________________________________________________
¿Qué nos queda? 1. Añadir un cierto ruido (variaciones aleatorias a algunas articulaciones 2. Reducir el salto al final y aumentarlo al principio, para llegar más deprisa a la aproximación óptima. 3. Variar esa cota de calidad 4, Variar la distancia, es decir su tipo. 5. Añadir orígenes diferentes a cada imagen (translación diferente para cada uno, situación que se presenta con dos cámaras. 6. Operar con dos cámaras reales, diferentes y simultáneas.
Vuelta al Principio Última actualización: viernes, 18 de septiembre de 2015 Visitantes: