Estoy trabajando en un algoritmo que debe alinear un par de imágenes. El modelo de movimiento, que describe la pose pp de una imagen (con respecto a la segunda) en el espacio 3D, es puramente rotacional.
Teoría a mi pregunta:
Según la fórmula de Rodrigues para las matrices de rotación, la matriz exponencial R(p)=eˆp para un vector p=(px,py,pz)T∈R3 viene dada por R(p)=eˆp=I+ˆp||p||sin(||p||)+ˆp2||p||2(1−cosθ) donde ||p||=√p2x+p2y+p2z y ˆp=[0−pzpypz0−px−pypx0].
Resumiendo los elementos de R(p) produce R(p)=[1−(p2y+p2z)s−pzr+pxpyspyr+pxpzspzr+pxpys1−(p2x+p2z)s−pxr+pypzs−pzr+pxpzspxr+pypzs1−(p2x+p2y)s] donde r=sin(||p||)||p|| y s=(1−cos(||p||))||p||2 se introdujeron para mayor claridad.
Ahora, dejemos que Rs(p)∈R9×1 sea la versión apilada de R(p) es decir, todas las columnas se apilan en una sola columna y deja que Rsi(p) denotan el i -éste es el elemento de Rs(p) donde 1≤i≤9 .
La matriz jacobiana JR∈R9×3 con respecto al vector p viene dada por JR=∂Rs∂p=[∂Rs1∂px∂Rs1∂py∂Rs1∂pz⋮⋮⋮∂Rs9∂px∂Rs9∂py∂Rs9∂pz]
El primer elemento de JR puede expresarse entonces como ∂Rs1∂px=∂∂px(1−(p2y+p2z)(1−cos(||p||))||p||2)=−[(p2y+p2z)sin(||p||)px||p||−(1−cos(||p||)2px)||p||4] el segundo como ∂Rs1∂py=∂∂py(1−(p2y+p2z)(1−cos(||p||))||p||2)=−[2py1−cos(||p||)||p||2+(p2yp2z)sin(||p||)py||p||−(1−cos(||p||)2py)||p||4] y el tercer elemento de la primera fila como ∂Rs1∂pz=∂∂pz(1−(p2y+p2z)(1−cos(||p||))||p||2)=−[2pz1−cos(||p||)||p||2+(p2yp2z)sin(||p||)pz||p||−(1−cos(||p||)2pz)||p||4]
Ya es un Muchas gracias por haber leído hasta aquí ;-)
Mi pregunta: ¿Es la derivación de estos 3 primeros elementos de JR ¿Matemáticamente correcto? Si he hecho algo mal, ¿podríais detectar el error o los errores y ayudarme a corregirlos?
Cuando lo tenga todo claro, publicaré la matriz jacobiana completa como respuesta a esta pregunta. Para que cualquiera que se enfrente al mismo problema pueda volver a comprobar sus propios resultados...
La razón por la que necesito este jacobiano:
La postura p de una imagen en la aplicación mencionada anteriormente puede describirse mediante un eje de rotación unitario y un ángulo (en radianes). Alternativamente, el eje unitario puede ser escalado de acuerdo con el ángulo de rotación, que es lo que estoy utilizando. Para hacer el mapeo exponencial de R3 a SO(3) utilizo la fórmula de Rodrigues (que es el método estándar, creo).
El algoritmo se "desliza" por el gradiente de una función de error, que se rige por la pose p es decir E(p)=∑i(I1(x′(xi;p))−I0(xi))2 donde x′(⋅) es la función que mapea los píxeles de un espacio de imagen al otro espacio de imagen con respecto a la pose actual p .
Para calcular el gradiente de E(p) Tendré que calcular el gradiente de las matrices de rotación, lo que me lleva a mi verdadero problema.
0 votos
Tienes razón, usar esos cuatro parámetros no tiene sentido. ¿Por qué es ∂θ∂ωx=ωxθ ? Por la forma en que los presentaste, ωx es un componente del vector unitario ω que es independiente de θ . Parece que te has confundido θ con un ángulo en una representación de coordenadas esféricas de ω ? Creo que querrás tomar derivadas parciales con respecto a los componentes de p pero para decir más sería bueno saber lo que estás haciendo realmente - ¿para qué necesitas el jacobiano?
0 votos
Utilizo un modelo de movimiento puramente rotacional para alinear un par de imágenes. Los parámetros de pose, es decir, el eje y el ángulo de rotación, se actualizan en función del gradiente de una función de error que mide ese solapamiento correcto entre las dos imágenes. En ese gradiente me encuentro con el gradiente de las matrices de rotación. Para eso lo necesito.