Take the 2-minute tour ×
Signal Processing Stack Exchange is a question and answer site for practitioners of the art and science of signal, image and video processing. It's 100% free, no registration required.

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 !

share|improve this question
add comment

2 Answers

up vote 5 down vote accepted

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.

share|improve this answer
    
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
add comment

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) $

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.