エピポーラ幾何

# 導入
3次元空間を異なる位置のカメラから撮影したときの幾何のこと。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36612/b92236bf-5bb4-773e-5b0b-f0a8aa29c8aa.png" width="50%" />

「カメラ $O_L$ から見ると $X_L$ に物体が写っている」ことしか分かっていない時点では、 $X, X_1, X_2, X_3$ のどこに物体があるかわからない。「カメラ $O_R$ から見て $X_R$ に同じ物体が写っている」ことも分かった場合は、 $X$ に物体があると特定できる。

- **エピポーラ線（Epiline）** : 図の赤線
    - 「カメラ $O_L$ から見て $X_L$ に物体が写っている」とき、「カメラ $O_R$ から見てどこに物体が写るか」の候補

- **エピポール（Epipole）** : 図の点 $e_L, e_R$
    - 一方のカメラから他方のカメラが写る位置のこと
    - 物体の位置に関係なく一定
    - どの物体のエピポーラ線もエピポールで交わる

- **エピポーラ面（Epipolar Plane）** : 図の緑面 $O_L X O_R$
    - 物体の位置と2つのカメラ位置の3点で決まる平面
    - エピポーラ線・エピポールはエピポーラ面上にある

# エピポーラ拘束
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36612/b90bb457-402a-1c93-676d-30f0d00080a5.png" width="50%" />

$P$ にある物体は、カメラ $C$ からは $\boldsymbol{p}$ 、カメラ $C'$ からは $\boldsymbol{p'}$ に写る。

- $\boldsymbol{p} = (x_p, y_p, 1)$
    - $C$ を原点とした同次座標系（ $C$ 座標系）
- $\boldsymbol{p'} = (x_{p'}, y_{p'}, 1)$
    - $C'$ を原点とした同次座標系（ $C'$ 座標系）

ここで、以下のことがいえる。

1. 「カメラ $C$ から見て $p$ に物体が写っている」ことしか分かっていない時点では、カメラ $C'$ でその物体が写る（ $\boldsymbol{p'}$ がある）位置は「エピポーラ線上のどこか」に限定される。
2. 「カメラ $C'$ から見て $p'$ に物体が写っている」ことしか分かっていない時点では、カメラ $C$ でその物体が写る（ $\boldsymbol{p}$ がある）位置は「エピポーラ線上のどこか」に限定される。

このことを**エピポーラ拘束（Epipolar Constraint）**と呼ぶ。

次に、エピポーラ拘束を数式で表すことを考える。

## 基本行列による表現
上記1.を基に話を進める（最終的には1.と2.が同じ数式で表される）。
上記1.は、以下のように表せる。

「 $\boldsymbol{p'} = (x_{p'}, y_{p'}, 1)$ はエピポーラ線上にある」 --- (1-1)

エピポーラ線の方程式を $ax + by + c = 0$ とし、さらに係数ベクトル $(a, b, c)$ を $\boldsymbol{l}$ とする。
すると、(1-1)は以下のように書き換えられる。

「 $\boldsymbol{p'} = (x_{p'}, y_{p'}, 1)$ は $\boldsymbol {p'} \cdot \boldsymbol{l} = a x_{p'} + b y_{p'} + c = 0$ を満たす」
$\Leftrightarrow$ 「$\boldsymbol{p'} = (x_{p'}, y_{p'}, 1)$ は $\boldsymbol{l}$ と常に垂直である」 --- (1-2)

これを満たす $\boldsymbol{l}$ を決めたい。 $\boldsymbol{p'}$ はエピポーラ面上にあるため、 $\boldsymbol{l}$ はエピポーラ面に垂直であればよい。
よって、 $\boldsymbol{l} = \boldsymbol{t} \times R \ \boldsymbol{p}$ とする（以下理由より）。

- 理由
    - 2つのベクトルの外積はそれらのベクトルが張る平面に垂直である（外積の定義より）
    - $\boldsymbol{t}$ はエピポーラ面上のベクトルである（図より）
        - 図では始点が $C$ だが、ここでは $C'$ 座標系で取り扱っていることに注意
    - $R \ \boldsymbol{p}$ はどちらもエピポーラ面上のベクトルである
        - $C$ 座標系の $\boldsymbol{p}$ を $C'$ 座標系で取り扱うために $R$ を作用させている

これにより、(1-2)は以下のように書き換えられる。

「 $\boldsymbol{p'} = (x_{p'}, y_{p'}, 1)$ は $\boldsymbol{p'} \cdot (\boldsymbol{t} \times R \ \boldsymbol{p}) = 0$ を満たす」 --- (1-3)

さらに、ベクトル $\boldsymbol{t}$ と行列 $R$ を一括で扱うため変形する。
ベクトル $\boldsymbol{t}$ による外積と同じ作用となる行列は歪対称行列 $[\boldsymbol{t}]_{\times}$ として表せる。

これにより、(1-3)は以下のように書き換えられる。

「 $\boldsymbol{p'} = (x_{p'}, y_{p'}, 1)$ は $\boldsymbol{p'} \cdot ([\boldsymbol{t}]_{\times} R \ \boldsymbol{p}) = 0$ を満たす」 --- (1-4)

ここで、 $E = [\boldsymbol{t}]_{\times} R$ とおく。この $E$ を**基本行列（Essential Matrix）**と呼ぶ。
基本行列 $E$ を用いて(1-4)の条件式を書き換えると、以下のようになる。

$$\boldsymbol{p'}^T \ E \ \boldsymbol{p} = 0 \tag{1}$$

これが、基本行列を用いて表したエピポーラ拘束であり、上記2.における $\boldsymbol{p}$ に求められる条件でもある。

## 基礎行列による表現
カメラ固有のパラメータ（レンズ歪み等）を内部パラメータと呼ぶ。
ここまでは、カメラキャリブレーションにより内部パラメータが分かっており、その影響を除去したものとして考えていた。
そうでない場合、物体は $\boldsymbol{p}, \boldsymbol{p'}$ とずれた位置に写る。

カメラ $C$ の内部パラメータを $K$ 、カメラ $C'$ の内部パラメータを $K'$ とおく。
すなわち内部パラメータによって、カメラ $C$ からは $\boldsymbol{m} = K \boldsymbol{p}$ に、カメラ $C'$ からは $\boldsymbol{m'} = K' \boldsymbol{p'}$ に物体が写る。

式(1)を $\boldsymbol{m}, \boldsymbol{m'}$ を用いて書き換えると、以下のようになる。

$$\boldsymbol{m'}^T ({K'}^{-1})^T \ E \ K^{-1} \boldsymbol{m} = 0 \tag{2}$$

ここで、 $F = ({K'}^{-1})^T \ E \ K^{-1}$ とおく。この $F$ を**基礎行列（Fundamental Matrix）**と呼ぶ。
基礎行列 $F$ を用いて式(2)を書き換えると、以下のようになる。

$$\boldsymbol{m'}^T F \boldsymbol{m} = 0 \tag{3}$$

# 基本行列と基礎行列の違い
- 基本行列
    - カメラキャリブレーション済であると仮定している
    - カメラ間の移動・回転関係にのみ依存している
- 基礎行列
    - カメラキャリブレーションされていないと仮定している
    - カメラ間の移動・回転関係及び、各カメラの内部パラメータに依存している

# 参考
- [Epipolar geometry - Wikipedia](https://en.wikipedia.org/wiki/Epipolar_geometry)
- [エピポーラ幾何 | CVMLエキスパートガイド](https://cvml-expertguide.net/2019/08/04/term-epipolar-geometry/)
- [【コンピュータビジョン】ネコと学ぶエピポーラ幾何 - Qiita](https://qiita.com/ykoga/items/14300e8cdf5aa7bd8d31)
- [歪対称行列と外積行列 - DOSEIの日記](http://dosei.hatenadiary.jp/entry/20060512/p1)