3次元復元

提供: メモ帳@fmaj7b5.info
移動: 案内検索

目次

ステレオ法

別の場所から撮影した2枚(以上)の画像を使って3次元復元をする方法。 人間が左右の目の見え方の違いを使うのと原理は同じはず。 いわゆる三角測量ね。

素朴な方法

3次元点Xが2台のカメラに以下のように撮影されたとする。

  \begin{align}
    s \tilde{\boldsymbol{m}} &= P \tilde{\boldsymbol{X}} \\
    s^\prime \tilde{\boldsymbol{m}}^\prime &= P^\prime \tilde{\boldsymbol{X}}
  \end{align}

観測された画像座標(u, v) = (\tfrac{m_1}{m_3}, \tfrac{m_2}{m_3})とすると、

  \begin{array}{l}
    m_3 (u, v) = (m_1, m_2) \\
    \Rightarrow \left( p_{31} X_1 + p_{32} X_2 + p_{33} X_3 + p_{34} X_4 \right)
      \begin{bmatrix}
        u \\ v
      \end{bmatrix}
      =
      \begin{bmatrix}
        p_{11} X_1 + p_{12} X_2 + p_{13} X_3 + p_{14} X_4 \\
        p_{21} X_1 + p_{22} X_2 + p_{23} X_3 + p_{24} X_4
      \end{bmatrix}
  \end{array}
X_4 = 1としてXについて整理すると、以下を得る。

  \begin{bmatrix}
    p_{11} - p_{31} u & p_{12} - p_{32} u & p_{13} - p_{33} u \\
    p_{21} - p_{31} v & p_{22} - p_{32} v & p_{23} - p_{33} v
  \end{bmatrix}
  \begin{bmatrix}
    X_1 \\ X_2 \\ X_3
  \end{bmatrix}
  = -
  \begin{bmatrix}
    p_{14} - p_{34} u \\ p_{24} - p_{34} v
  \end{bmatrix}
このままだと式が足りないので、もう一つのカメラも同じようにする。

  \begin{bmatrix}
    p_{11} - p_{31} u & p_{12} - p_{32} u & p_{13} - p_{33} u \\
    p_{21} - p_{31} v & p_{22} - p_{32} v & p_{23} - p_{33} v \\
    p^\prime_{11} - p^\prime_{31} u^\prime & p^\prime_{12} - p^\prime_{32} u^\prime & p^\prime_{13} - p^\prime_{33} u^\prime \\
    p^\prime_{21} - p^\prime_{31} v^\prime & p^\prime_{22} - p^\prime_{32} v^\prime & p^\prime_{23} - p^\prime_{33} v^\prime
  \end{bmatrix}
  \begin{bmatrix}
    X_1 \\ X_2 \\ X_3
  \end{bmatrix}
  = -
  \begin{bmatrix}
    p_{14} - p_{34} u \\ p_{24} - p_{34} v \\
    p^\prime_{14} - p^\prime_{34} u^\prime \\ p^\prime_{24} - p^\prime_{34} v^\prime
  \end{bmatrix}
これを解けばもとの3次元座標が得られる。ちなみに未知数が3個に対して式が4本あるので、2台目のカメラの画像座標は片方だけ分かればいい。けど、そういう場合ってあるのか?

もっといい方法

観測には誤差がつきもの。なので、そこら辺を考慮した計算をすればもっと良くなるはず。

射影復元

M台のカメラにN点の3次元点が観測されたとする。

  \begin{bmatrix}
    s_{11} \tilde{\boldsymbol{m}}_{11} & \dots & s_{1N} \tilde{\boldsymbol{m}}_{1N} \\
    \vdots & & \vdots \\
    s_{M1} \tilde{\boldsymbol{m}}_{M1} & \dots & s_{MN} \tilde{\boldsymbol{m}}_{MN}
  \end{bmatrix}
  =
  \begin{bmatrix}
    P_1 \\ \vdots \\ P_M
  \end{bmatrix}
  \begin{bmatrix}
    \tilde{\boldsymbol{X}}_1 & \dots & \tilde{\boldsymbol{X}}_N
  \end{bmatrix}
そうすると、左辺の3MxN行列は3Mx4行列と4xN行列の積でできているから、ランクが4しか無い事が分かる。 なので、観測した点の画像座標を並べた行列をうまく分解して3Mx4行列Aと4xN行列Bにすると、それぞれ射影行列と3次元点になりますよって話。

ただし、任意の正則な4x4行列Hを使って

  A B = A H^{-1} H B = \left( A H^{-1} \right) \left( H B \right) = A^\prime B^\prime
とできるので、分解の仕方は一通りではない。 世の中それほどうまくいかない。