FrontPage

  • ちょっとネットで見かけた3次元から3次元への変換行列。
  • といっても、スケールや直交性は維持されてるので、単なる視点変換の話。

前提条件

  • 変換前の3次元座標をAと変換後の3次元座標Bを
    \text{A} = \left( \begin{array}{c}X\\Y\\Z\\1\end{array} \right)
    \text{B} = \left( \begin{array}{c}X^{\prime}\\Y^{\prime}\\Z^{\prime}\\1\end{array} \right)
  • と定義する

変換行列

  • 変換行列をMとする。
  • 変換行列Mは以下の様な特性を持つ
    \text{B} = \text{M}\text{A}
    \left( \begin{array}{c}X^{\prime}\\Y^{\prime}\\Z^{\prime}\\1\end{array} \right) = \left(\begin{array}{cccc}M_{11}&M_{12}&M_{13}&M_{14}\\M_{21}&M_{22}&M_{23}&M_{24}\\M_{31}&M_{32}&M_{33}&M_{34}\\0&0&0&1\end{array}\right)\left( \begin{array}{c}X\\Y\\Z\\1\end{array} \right)
  • さらに、Mの内部も回転行列Rと並進成分tに分けられる
    \left( \begin{array}{c}X^{\prime}\\Y^{\prime}\\Z^{\prime}\\1\end{array} \right) = \left(\begin{array}{cccc} & \text{R} & & \text{t}\\0&0&0&1\end{array}\right)\left( \begin{array}{c}X\\Y\\Z\\1\end{array} \right)

ツッコミ

  • 閲覧したサイトには
    • まず行と列が逆になっていた
    • 4行目(サイトでは4列目)が \left(0 0 0 1\right) となるような制約が抜けていた
  • ので、その辺りの制約を加えるとなると、以下の様にする必要がある。
    \left( \begin{array}{c}X^{\prime}\\Y^{\prime}\\Z^{\prime}\end{array} \right) = \left( \begin{array}{cccccccccccc} X&Y&Z&1&0&0&0&0&0&0&0&0\\ 0&0&0&0&X&Y&Z&1&0&0&0&0\\ 0&0&0&0&0&0&0&0&X&Y&Z&1 \end{array} \right)\left(\begin{array}{c} M_{11}\\M_{12}\\M_{13}\\M_{14}\\M_{21}\\M_{22}\\M_{23}\\M_{24}\\M_{31}\\M_{32}\\M_{33}\\M_{34} \end{array}\right)
  • 1つの点同士の対応で3本の方程式が成り立つ。
    • 真ん中の行列が3行存在する、という意味。
  • 点を増やせば、増やした数だけ、真ん中の行列は点数*3行ずつ増え、左辺は1列ずつ増える
  • 真ん中の行列の逆行列を求めたいので、最低4点必要になる。
    \left( \begin{array}{c} X^{\prime}_{1}\\Y^{\prime}_{1}\\Z^{\prime}_{1} \\ X^{\prime}_{2}\\Y^{\prime}_{2}\\Z^{\prime}_{2}\\ X^{\prime}_{3}\\Y^{\prime}_{3}\\Z^{\prime}_{3}\\ X^{\prime}_{4}\\Y^{\prime}_{4}\\Z^{\prime}_{4} \end{array} \right) = \left( \begin{array}{cccccccccccc} X_{1}&Y_{1}&Z_{1}&1&0&0&0&0&0&0&0&0\\ 0&0&0&0&X_{1}&Y_{1}&Z_{1}&1&0&0&0&0\\ 0&0&0&0&0&0&0&0&X_{1}&Y_{1}&Z_{1}&1\\ X_{2}&Y_{2}&Z_{2}&1&0&0&0&0&0&0&0&0\\ 0&0&0&0&X_{2}&Y_{2}&Z_{2}&1&0&0&0&0\\ 0&0&0&0&0&0&0&0&X_{2}&Y_{2}&Z_{2}&1\\ X_{3}&Y_{3}&Z_{3}&1&0&0&0&0&0&0&0&0\\ 0&0&0&0&X_{3}&Y_{3}&Z_{3}&1&0&0&0&0\\ 0&0&0&0&0&0&0&0&X_{3}&Y_{3}&Z_{3}&1\\ X_{4}&Y_{4}&Z_{4}&1&0&0&0&0&0&0&0&0\\ 0&0&0&0&X_{4}&Y_{4}&Z_{4}&1&0&0&0&0\\ 0&0&0&0&0&0&0&0&X_{4}&Y_{4}&Z_{4}&1\\ \end{array} \right)\left(\begin{array}{c} M_{11}\\M_{12}\\M_{13}\\M_{14}\\M_{21}\\M_{22}\\M_{23}\\M_{24}\\M_{31}\\M_{32}\\M_{33}\\M_{34} \end{array}\right)
  • これで、ようやく真ん中の行列の逆行列が求められる。
  • この逆行列を左辺に右側からかければ、欲しい変換行列パラメータ M が求まる。
    \left( \begin{array}{cccccccccccc} X_{1}&Y_{1}&Z_{1}&1&0&0&0&0&0&0&0&0\\ 0&0&0&0&X_{1}&Y_{1}&Z_{1}&1&0&0&0&0\\ 0&0&0&0&0&0&0&0&X_{1}&Y_{1}&Z_{1}&1\\ X_{2}&Y_{2}&Z_{2}&1&0&0&0&0&0&0&0&0\\ 0&0&0&0&X_{2}&Y_{2}&Z_{2}&1&0&0&0&0\\ 0&0&0&0&0&0&0&0&X_{2}&Y_{2}&Z_{2}&1\\ X_{3}&Y_{3}&Z_{3}&1&0&0&0&0&0&0&0&0\\ 0&0&0&0&X_{3}&Y_{3}&Z_{3}&1&0&0&0&0\\ 0&0&0&0&0&0&0&0&X_{3}&Y_{3}&Z_{3}&1\\ X_{4}&Y_{4}&Z_{4}&1&0&0&0&0&0&0&0&0\\ 0&0&0&0&X_{4}&Y_{4}&Z_{4}&1&0&0&0&0\\ 0&0&0&0&0&0&0&0&X_{4}&Y_{4}&Z_{4}&1\\ \end{array} \right)^{-1}\left( \begin{array}{c} X^{\prime}_{1}\\Y^{\prime}_{1}\\Z^{\prime}_{1} \\ X^{\prime}_{2}\\Y^{\prime}_{2}\\Z^{\prime}_{2}\\ X^{\prime}_{3}\\Y^{\prime}_{3}\\Z^{\prime}_{3}\\ X^{\prime}_{4}\\Y^{\prime}_{4}\\Z^{\prime}_{4} \end{array} \right) = \left(\begin{array}{c} M_{11}\\M_{12}\\M_{13}\\M_{14}\\M_{21}\\M_{22}\\M_{23}\\M_{24}\\M_{31}\\M_{32}\\M_{33}\\M_{34} \end{array}\right)

その他/考察

  • 本当なら、スケーリング係数も考えないと行けないのだが、両方の点の最後の要素が1、行列の右下の要素も1という制約を守るなら、これでもいける
  • あと、本当は回転行列はそれぞれノルムが1となる列ベクトル3本から成り立ってるはずで、その辺りの制約を入れればもっと精度がよくなる。
  • 多分、ノイズが乗る/乗らないという話以前に、変換行列の4行目に対する制約を導入すれば、ノイズが多少は減るはず。
  • 回転行列の制約を式に導入する方法に関しては未勉強なので、追々。

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-10-09 (火) 00:09:05 (2538d)