I have 2 images, called left and right images. I have some matched points $[c_l,r_l]$ and $[c_r,r_r]$ in both of them (these points are in pixel coordinates).

For a 3D point in the real world, they are related by:

$\lambda_l*[c_l , r_l,1]^t = W_l*[X,Y,Z]^t$

$\lambda_r*[c_r ,r_r,1]^t = W_r*[R|T]*[X,Y,Z,1]^t$

Here $W_l$ and $W_r$ are the intrinsic parameters of the left and right cameras and $T and R$ are the relative / overall translation and rotation between the cameras.

I attempted to solve this as:

$Q*[M,1]^T = 0$

where Q is

$$ \begin{matrix} (k_1 +k_2-k_3*c_r-k_3*r_r) & (tw_x + tw_y -r_r*tw_z - c_r*tw_z) \\ (w_1 + w_2 - w_3*c_l -w_3*r_l) & 0 \\ \end{matrix} $$

and M is $[X,Y,Z]$


  • $k1,k2, k3$ are the rows of the matrix K given by $K = R_r*R$
  • $tw$ is the vector formed by $tw = W_r*T$, its elements are $[tw_x,tw_y,tw_z]$
  • $w1, w2, w3$ are the rows of the matrix $W_l$

I'm solving this as:

$Q*[M,1]^t = 0$

I look for a solution in the null space of $Q$.

$[M,1]^t$ would be hence be the null vector of Q.

That is,

$svd(Q) = [U,S,V]$ and $[M,1]^t$ would be the last column of V.

The result I get would be of form $[mx,my,mz,mk]$ so I simply divide all elements by $mk$ to get something of the form

$[mx/mk,my/mk,mz/mk,1]$. I consider this to be the value of X,Y,Z

Is there a better way to solve this? Correct me if I'm wrong here but I'm feel this could have been done in a simpler (more accurate) fashion.

  • $\begingroup$ Can you explain more clearly what you're trying to do, which information is given and which you are trying to solve for? $\endgroup$ – Nathan Reed Nov 13 '17 at 3:53

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.