# How does reszing a image affect the intrinsic camera matrix?

I have a camera matrix (I know both intrinsic and extrinsic parameters) known for image of size HxW. (I use this matrix for some calculations I need).

I want to use a smaller image, say: $\frac{H}{2}\times \frac{W}{2}$ (half the original). What changes do I need to make to the matrix, in order to keep the same relation ?

I have, $K$ as the intrinsic parameters, ($R$,$T$ rotation and translation)

$$\text{cam} = K \cdot [R T]$$

$$K = \left( \begin{array}&a_x &0 &u_0\\0 &a_y &v_0 \\ 0 &0 &1\end{array} \right)$$

$K$ is 3*3, I thought on multiplying $a_x$, $a_y$, $u_0$, and $v_0$ by 0.5 (the factor the image was resized) , but I'm not sure! Thanks !

-

Note: That depends on what coordinates you use in the resized image. I am assuming that you are using zero-based system (like C, unlike Matlab) and 0 is transformed to 0. Also, I am assuming that you have no skew between coordinates. If you do have a skew, it should be multiplied as well

Short answer: Assuming that you are using a coordinate system in which $u' = \frac{u}{2} , v' = \frac{v}{2}$, yes, you should multiply $ax,ay,u0,v0$ by 0.5.

Detailed answer The function that converts a point $P$ in world coordinates to camera coordinates $(x,y,z,1)->(u,v,S)$ is:

$\left( \begin{array}{ccc} ax & 0 & u_0 \\ 0 & ay & v_0 \\ 0 & 0 & 1 \end{array} \right) \left( \begin{array}{ccc} R_{11} & R_{12} & R_{13} & T_x \\ R_{21} & R_{22} & R_{23} & T_y \\ R_{31} & R_{32} & R_{33} & T_z \\ 0 & 0& 0 & 1 \end{array} \right) \left( \begin{array}{ccc} x \\ y \\ z \\ 1 \end{array} \right)$

Where $(u,v,S)->(u/S,v/S,1)$, since the coordinates are homogenous.

In short this can be written as $u= \frac{m_1 P}{m_3 P} , v = \frac{m_2 P}{m_3 P}$
where $M$ is the product of the two matrixes mentioned above, and $m_i$ is the i'th row of the matrix $M$. (The product is scalar product).

Re-sizing the image can be thought of:

$u'=u/2, v'=v/2$

Thus

$u' = (1/2) \frac {M_1 P} {M_3 P} \\ v' = (1/2) \frac {M_2 P} {M_3 P}$

Converting back to matrix form gives us:

$\left( \begin{array}{ccc} 0.5 & 0 & 0 \\ 0 & 0.5 & 0 \\ 0 & 0 & 1 \end{array} \right) \left( \begin{array}{ccc} ax & 0 & u_0 \\ 0 & ay & v_0 \\ 0 & 0 & 1 \end{array} \right) \left( \begin{array}{ccc} R_{11} & R_{12} & R_{13} & T_x \\ R_{21} & R_{22} & R_{23} & T_y \\ R_{31} & R_{32} & R_{33} & T_z \\ 0 & 0& 0 & 1 \end{array} \right) \left( \begin{array}{ccc} x \\ y \\ z \\ 1 \end{array} \right)$

Which is equal to

$\left( \begin{array}{ccc} 0.5 ax & 0 & 0.5 u_0 \\ 0 & 0.5 ay & 0.5 v_0 \\ 0 & 0 & 1 \end{array} \right) \left( \begin{array}{ccc} R_{11} & R_{12} & R_{13} & T_x \\ R_{21} & R_{22} & R_{23} & T_y \\ R_{31} & R_{32} & R_{33} & T_z \\ 0 & 0& 0 & 1 \end{array} \right) \left( \begin{array}{ccc} x \\ y \\ z \\ 1 \end{array} \right)$

For additional information, refer to Forsyth, chapter 3 - Geometric camera calibration.

-
Thanks a lot for the explanation !!! I'm just no so sure what you mean by zero-based system , I'm using matlab, do I need any other adjustments ? –  matlabit Nov 21 '12 at 15:31
@matlabit, If you are using Matlab, you should use the transformation with $u' = (u-1)/2 + 1 , v' = (v-1)/2 + 1$, since it has one-based indexing (First element is 1, not 0). Try to compute the relevant matrix in this case. If you do not need sub-pixel accuracy, you can just ignore it and use the formula I gave you. –  Andrey Nov 21 '12 at 19:15

Andrey mentioned that his solution assumes 0 is transformed to 0. If you are using pixel coordinates this is likely not true when you re-size the image. The only assumption you really need to make is that your image transformation can be represented by a 3x3 matrix (as Andrey demonstrated). To update your camera matrix you can just premultiply it by the matrix representing your image transformation.

[new_camera_matrix] = [image_transform]*[old_camera_matrix]


As an example, say you need to change the resolution of an image by a factor $2^n$ and you are using 0 indexed pixel coordinates. Your coordinates are transformed by the relationships

$x' = 2^n*(x+.5)-.5$

$y' = 2^n*(y+.5)-.5$

this can be represented by the matrix

$\left( \begin{array}{ccc} 2^n & 0 & 2^{n-1}-.5 \\ 0 & 2^n & 2^{n-1}-.5 \\ 0 & 0 & 1 \end{array} \right)$

so your final camera matrix would be

$\left( \begin{array}{ccc} 2^n & 0 & 2^{n-1}-.5 \\ 0 & 2^n & 2^{n-1}-.5 \\ 0 & 0 & 1 \end{array} \right) \left( \begin{array}{ccc} ax & 0 & u_0 \\ 0 & ay & v_0 \\ 0 & 0 & 1 \end{array} \right)$

-