鏡の壁の話

この記事は[壁Advent Calender2017](https://adventar.org/calendars/2591)の12/19日分の記事です．

今日は誰しもが一度はぶつかったことのある壁，鏡の壁について書きます．

## 鏡の壁
「鏡にぶつかったことなんてない」という人もいるかもしれませんが，遠い過去の記憶を探るときっとあるはずです．そう，例えばミラーハウスの中で．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/149/2ad6ebc8-524b-35ff-c56f-fd97f9685654.png)
(画像は[こちら](https://www.tripadvisor.jp/LocationPhotoDirectLink-g186525-d213416-i32561457-Camera_Obscura_and_World_of_Illusions-Edinburgh_Scotland.html)より引用)

思い返せばミラーハウスではどの方向に歩いていっても鏡の壁にぶつかって，出口が全然わからなくなって本当に鏡の世界に閉じ込められたような感覚に陥り何度も泣いた覚えがあります．もう二度と入るか！と思い，連れて行った親を糾弾した記憶もあります．もはやトラウマレベルで刻まれているあの恐怖．

とはいっても鏡は怖いだけではありません．ミラーハウスのような構成の鏡は他にも万華鏡などで見ますね．あれは美しい．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/149/917b61ce-f3a4-baac-7aaf-e99022f70d03.png)
（画像は[こちら](http://jet-walk.jp/4leafclover/%E3%82%88%E3%81%A4%E3%81%B0%E6%97%85%E3%80%82/%E6%9D%B1%E4%BA%AC%E3%81%AE%E4%B8%87%E8%8F%AF%E9%8F%A1%E5%BA%97/)より引用）
これらもある実像を平面鏡によって何回も鏡像に変換し合うことで，このような美しい幾何学模様がうまれているんですね．ちなみに万華鏡のことはkaleidoscopeといいます．

## 本記事の目的
ミラーハウスや万華鏡のようなKaleidoscopeを見て誰しもが思うことは，やはり「鏡のことをもっと知りたい」でしょう．もっと正確に言うなら，「鏡平面の法線と距離をもっと知りたい」ですね．

そんな長年の皆様の思いに本記事では答えたいと思います．

本記事を読むことで何が出来るようになるかというと，「**カメラで撮影した１枚の画像から，Kaleidoscopeに含まれる全ての鏡の法線およびカメラからの距離を求めることができる！**」というものです．以下ではそれについて詳しく説明します．
なお，以下では図は全て[参考文献](https://arxiv.org/abs/1703.02826)のものを利用します．

## 鏡映変換について
ある平面鏡$\pi$の法線及びカメラからの距離をそれぞれ$\boldsymbol{n}$, $d$とします．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/149/298a7d99-b6f6-46cf-6ce8-4b10b9bdb44a.png)
このとき，ある三次元点$\boldsymbol{p}$とその鏡像$\boldsymbol{p}'$の間には以下のような関係が成り立ちます．（ちなみに$\tilde{\boldsymbol{p}}$は$\boldsymbol{p}$のHomogeneous coordinatesです．）

```math
  \tilde{\boldsymbol{p}} = \begin{bmatrix}
H & -2d\boldsymbol{n} \\
0_{3\times1}& 1 
\end{bmatrix} \tilde{\boldsymbol{p}}'
```
この変換は鏡映変換(Householder変換)と呼ばれるやつですね．おなじみです．この時，鏡像$\boldsymbol{p}'$は$\boldsymbol{p}$を鏡の裏側の視点から見た像にほかなりません．すなわち，**鏡を使うことで対象を別の視点から見た像が得られる**というわけですね．

これらの像はそれぞれ$\boldsymbol{q}, \boldsymbol{q}'$として観測されることとします．

## 鏡のエピポーラ幾何
別の視点．．．複数視点．．．ﾊｯ．．．ｴ．．．ｴﾋﾟﾎﾟｰﾗ幾何．．．？？？

そうです，複数視点から観測した共通の点の２次元座標値$\boldsymbol{q},\boldsymbol{q}'$が手元にある人は，無意識にこれらを使ってエピポーラ拘束式を導きたくなると思います．導いてみましょう．

```math
\boldsymbol{q}^\top A^{-\top} [\boldsymbol{n}]_{\times}^{\top} A^{-1} \boldsymbol{q}' = 0
```
このとき，$A$はカメラの内部パラメータから成る行列です．今回は既知とします．
はい，とても見覚えの有る式になりましたね．唯一違うのは$[\boldsymbol{n}]^{\top}_{\times}$のところでしょうか．この式から，鏡の幾何においては$\boldsymbol{n}$の歪み対称行列が通常のエピポーラ幾何における基本行列に相当することがわかります．美しい．

この式は$A^{-1}\boldsymbol{q}=(x,y), A^{-1}\boldsymbol{q}'=(x',y')$と置くことで以下のように書き直せます．

```math
 \begin{pmatrix}
 y - y' & x' - x & x y' - x' y
 \end{pmatrix}
 \boldsymbol{n}= 0.   ...(*)
```
すなわち，ある１点の三次元点$\boldsymbol{p}$とその鏡像の投影点の座標値から，$\boldsymbol{n}$に関して1本の制約式が得られます．ここで法線$\boldsymbol{n}$は自由度２であることから，**2点の三次元点が存在すれば，その鏡像から法線$\boldsymbol{n}$が求められる**ということを意味します．


## え．．２点もいるの．．．美しくない．．．
皆さんそう思ったかと思います．２点も三次元点が必要なんて美しくないです．しかし安心してください．このKaleidoscopeにはもう一つマジックがあります．

下の図は三枚の鏡からなるKaledidoscopeですが，ある三次元点$\boldsymbol{p_0}$の投影点を$\boldsymbol{q_0}$ とし，鏡$\pi_1$（青い線）による鏡像$\boldsymbol{p_1}$の投影点を$\boldsymbol{q_1}$とします．ここで，別の鏡$\pi_2$($M_0$と$M_2$の間に存在する)も鏡$\pi_1$によって折り返されており，その仮想鏡によって$\boldsymbol{p_1}$が折り返された三次元点を$\boldsymbol{p_{12}}$とします．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/149/7237dec6-ac0c-5763-bf25-af20813887b3.png)

この複数回反射で得られた$\boldsymbol{p_{12}}$は，実は$\boldsymbol{p_0}$を鏡$\pi_2$で折り返した点$\boldsymbol{p_2}$と，鏡$\pi_1$に関して一回反射の鏡像の関係にあります．そのため，それらの投影点である$\boldsymbol{q_{12}}$と$\boldsymbol{q_2}$の間に式(*)が成り立ちます．

あれ．．．なんか鏡$\pi_1$に関して制約式増えてない．．．？と思われる方もいらっしゃるかもしれません．

そうです．制約式が増えてるんです．実際には１点の三次元点しか存在してないのに，制約式は２つに増えてます．なんなら$\boldsymbol{q_3}$と$\boldsymbol{q_{13}}$の間でも同様のことが言えるので，結局３つに増えます．これなら余裕で法線が求まります．

何か肩透かしを喰らったような気分になりますが，直感的に言うと，**ある鏡の法線を求めたい時に，その鏡とは独立の鏡を利用することで点の数（制約式）を増やしてしまおう**という事になります．

そして何より，**通常$\boldsymbol{p_{12}}$などの複数反射によって得られる三次元座標値を表す式は，未知な鏡の法線や距離を複数回掛け合わせることになるので非線形な式になります．しかしそれらの投影点は，ある鏡に関して線形な拘束式で表せてしまう**というところにこの手法の美しさを感じます．本当に美しい．

ここまでくれば後はもう簡単ですね．ｴｲﾔと法線を求めて，距離もちょいちょいとすれば求まって終わりです．最後にバンドルアジャストメントとかしちゃうと100点です．

## まとめ
本記事ではKaleidoscopeに潜む美しい幾何学について紹介しました．
本記事の狙いでは「**カメラで撮影した１枚の画像から，Kaleidoscopeに含まれる全ての鏡の法線およびカメラからの距離を求めることができる！**」と紹介しましたが，より正確には「**カメラで撮影した１点の三次元点の１枚の画像から，Kaleidoscopeに含まれる全ての鏡の法線およびカメラからの距離を線形に求めることができる！**」というものでした．

完全に深夜のテンション（現在AM1:42）で書いたので途中から何がいいたいのかよくわからなくなってきましたが，とりあえず鏡はいいぞ，ということです．細かいことは原著を読んで下さい．

## 参考文献
本記事は[A Linear Extrinsic Calibration of Kaleidoscopic Imaging System from Single 3D Point](https://arxiv.org/abs/1703.02826)を参考にしました．
実装は[こちら](https://github.com/computer-vision/cvpr2017)にあります．