¿Cómo afecta el cambio de tamaño de una imagen a la matriz intrínseca de la cámara?

18

Tengo una matriz de cámara (conozco los parámetros intrínsecos y extrínsecos) conocida por la imagen de tamaño HxW. (Utilizo esta matriz para algunos cálculos que necesito).

Quiero usar una imagen más pequeña, por ejemplo: (la mitad del original). ¿Qué cambios necesito hacer en la matriz para mantener la misma relación?H2×W2

Tengo, como parámetros intrínsecos, ( , rotación y traslación)R TKRT

cam=K[RT]

K=(ax0u00ayv0001)

K es 3 * 3, pensé en multiplicar , , y por 0.5 (el factor de cambio de tamaño de la imagen), pero no estoy seguro.a y u 0 v 0axayu0v0

matlabit
fuente

Respuestas:

13

Nota: Eso depende de las coordenadas que use en la imagen redimensionada. Supongo que está utilizando un sistema basado en cero (como C, a diferencia Matlab) y 0 se transforma en 0. Además, supongo que no tiene sesgo entre las coordenadas. Si tienes un sesgo, también se debe multiplicar

Respuesta corta : suponiendo que está utilizando un sistema de coordenadas en el que , sí, debe multiplicar por 0.5.u=u2,v=v2ax,ay,u0,v0

Respuesta detallada La función que convierte un punto en coordenadas mundiales en coordenadas de cámara es:P(x,y,z,1)>(u,v,S)

(unX0 0tu0 00 0unyv0 00 00 01)(R11R12R13TXR21R22R23TyR31R32R33Tz0 00 00 01)(Xyz1)

Donde , ya que las coordenadas son homogéneas.(u,v,S)>(u/S,v/S,1)

En resumen, esto se puede escribir como donde es el producto de las dos matrices mencionadas anteriormente, y es el i ' º fila de la matriz . (El producto es producto escalar).u=m1Pm3P,v=m2Pm3P
MmiM

Se puede pensar en cambiar el tamaño de la imagen:

u=u/2,v=v/2

Así

u=(1/2)M1PM3Pv=(1/2)M2PM3P

Convertir de nuevo a forma matricial nos da:

(0.50000.50001)(ax0u00ayv0001)(R11R12R13TxR21R22R23TyR31R32R33Tz0001)(xyz1)

Que es igual a

(0,5unX0 00,5tu0 00 00,5uny0,5v0 00 00 01)(R11R12R13TXR21R22R23TyR31R32R33Tz0 00 00 01)(Xyz1)

Para obtener información adicional, consulte Forsyth , capítulo 3 - Calibración de cámara geométrica.

Andrey Rubshtein
fuente
Muchas gracias por la explicación !!! No estoy tan seguro de lo que quieres decir con sistema basado en cero, estoy usando matlab, ¿necesito otros ajustes?
matlabit
@matlabit, si está usando Matlab, debe usar la transformación con , ya que tiene una indexación basada en uno (Primero elemento es 1, no 0). Intente calcular la matriz relevante en este caso. Si no necesita precisión de subpíxel, puede ignorarlo y usar la fórmula que le di. tu=(tu-1)/ /2+1,v=(v-1)/ /2+1
Andrey Rubshtein el
8

Andrey mencionó que su solución asume que 0 se transforma a 0. Si está utilizando coordenadas de píxeles, esto probablemente no sea cierto cuando cambie el tamaño de la imagen. La única suposición que realmente necesita hacer es que su transformación de imagen se puede representar mediante una matriz de 3x3 (como demostró Andrey). Para actualizar la matriz de su cámara, puede premultiplicarla por la matriz que representa la transformación de su imagen.

[new_camera_matrix] = [image_transform]*[old_camera_matrix]

Como ejemplo, supongamos que necesita cambiar la resolución de una imagen por un factor y está utilizando 0 coordenadas de píxeles indexadas. Tus coordenadas son transformadas por las relaciones2norte

X=2norte(X+.5)-.5

y=2norte(y+.5)-.5

esto puede ser representado por la matriz

(2norte0 02norte-1-.50 02norte2norte-1-.50 00 01)

entonces tu matriz de cámara final sería

(2norte0 02norte-1-.50 02norte2norte-1-.50 00 01)(unX0 0tu0 00 0unyv0 00 00 01)

Martillo
fuente
2norte
1
Creo que el punto es que el centro del píxel "0, 0" no está realmente en "0, 0" (= esquina superior izquierda del píxel) sino en "0.5, 0.5". Por lo tanto, debe tener en cuenta ese desplazamiento antes y después de la transformación, y el factor siempre es 0.5, sin importar el factor de escala.
Jan Rüegg
Sí, eso es exactamente correcto
Martillo