Plane Sweeping Stereo 〜 理論編

ということで,導入編に引き続き理論編です.

0.Plane Sweeping Stereo のざっくり原理

まず,1つのモノを複数のカメラで撮影する状況を考えます.

f:id:rkoichi2001:20190624132011j:plain
複数カメラによる空間中の同一点の射影

で,上図を見るとわかると思うのですが,複数カメラで空間中の同一点を撮影した場合,カメラ中心からスクリーンを結んだ半直線(レイ)が実際に点が存在する場所で1つに交わります.この原理を使うと,複数画像に写っている点の3次元位置が分かりそうです.で,これをストレートに実装した場合,下記のようになります.
(前提として,事前に各カメラの相対位置がわかっている必要があります.)

f:id:rkoichi2001:20190624135224j:plain
空間中のボクセルを通過するレイ

が,実際問題として上記のように実装した場合グリッド数が爆発します.また,1ピクセルの視差の奥行き方向解像度も奥行きが大きくなるに連れて下がってくるので,グリッドの切り方にもかなり工夫が必要そうです.で,もう少し工夫して視差画像が求める方法として考案された方法が「Plane Sweep Stereo」になります.

Plane Sweeping Stereo の大まかなステップ

下図が原理イメージ図になりますが,大まかなステップとしては,
①複数ある画像から1つ Reference 画像を選択.
②Reference 画像の奥行き方向にいくつも仮説平面を設定します.
③他の画像を Source 画像と書いていますが,Source 画像からこの仮説平面へワープするためのホモグラフィー行列を計算します.
④実際にホモグラフィー行列を使ってSource画像を仮説平面にワープさせます.
⑤仮説平面とワープ後Source画像をピクセル単位で比較し,最も一致度が高かった仮説平面の番号をメモしておきます.
⑥すべての計算が終了後に,ピクセルにメモされている仮説平面の番号から,そのピクセルの深度がわかります.

f:id:rkoichi2001:20190624141939j:plain
Plane Sweep の原理イメージ図

なんだかずらずらと書いてしまったのですが,「もし仮説平面上に物体があったとすると,ワープ後Source画像と仮説平面はその部分に関してはとても良く一致するはずだ!」というのがミソです.

1.もう一度ホモグラフィー!

ということで,実際にミソの部分を実験してみます.奥行きの異なる場所に同じサイズのキャリブボードをおき,2つの視点から撮影します.キャリブボードを正面から撮影した画像がReference画像のイメージで,斜めから撮影した画像がSource画像のイメージです.

f:id:rkoichi2001:20190624151626p:plain
2つの視点から撮影した奥行きの異なる2つのキャリブボード

で,下記を検証します.
①手前側のキャリブボードの一致を使って計算したホモグラフィー行列による画像変換では,手前側のキャリブボードの部分「のみ」が綺麗に一致する.
②奥側のキャリブボードの一致を使って計算したホモグラフィー行列による画像変換では,奥側のキャリブボード「のみ」が綺麗に一致する.

f:id:rkoichi2001:20190624152657p:plain
手前側のキャリブボード

f:id:rkoichi2001:20190624153013p:plain
奥側のキャリブボード

手前側で計算したホモグラフィー行列とその変換

手前側のキャリブが綺麗に一致してます.

H = 
[2.919985764518131, 0.04163314453775299, -621.3982383025455;
 0.2764719489904646, 1.490676852159184, -37.0904308852414;
 0.0009696597430956257, 9.143936486285768e-06, 1]

f:id:rkoichi2001:20190624161134j:plain
手前側のキャリブレーションボードで計算したホモグラフィーによる変換

奥側で計算したホモグラフィー行列とその変換

奥側のキャリブが綺麗に一致してます.

H = 
[3.069557032214561, 0.2252515263892633, -1225.743495928632;
 0.3344542384857155, 1.836184439317147, -176.1551921844029;
 0.001130769317868212, 7.994190652823021e-05, 1]

f:id:rkoichi2001:20190624160458j:plain
奥側のキャリブレーションボードで計算したホモグラフィーによる変換

上記ホモグラフィーの実験から,仮想平面上に実際に物体がある場合,Source画像から仮想平面に対してのホモグラフィー変換すれば「該当ピクセルに関してのみ」は変換後画像と仮想平面画像がほぼ一致することがわかります.逆をいえば,「Source画像をホモグラフィー変換して仮想平面画像と比較した場合に,一致度が高ければ実際にそこには物体がある」と言えるのかなと思います.

2.アルゴリズム

ということで,アルゴリズム詳細に入っていきます.

アルゴリズムの入力・出力

f:id:rkoichi2001:20190624164453j:plain
アルゴリズムの状況設定と入力・出力

まず,入力と出力ですが,上図に書いてあるように,入力が下記になります.

入力

1.異なる視点で撮影した複数枚の画像(ステレオ校正されている必要は無し.)
2.各視点の位置(R, T)
3.各カメラの内部パラメータ

出力

1.Reference画像を元にした視差画像

通常のステレオと違って,このアルゴリズムでは複数枚の画像を使うことができます.なので,2画像のステレオで問題になるオクルージョンの問題も緩和することができます.論文ではこの当たりのアルゴ説明もされているのですが,今回は基本的な原理のみ下記下したいと思います.

二画像間のホモグラフィー

2つの画像の相対的な位置関係がわかっている時のホモグラフィーの導出の仕方です.ここで求めようとしているホモグラフィーによって「Reference画像のある画像座標 (x, y) から対応するSource画像の画像座標 (u, v) 」を求めます.2座標間の回転・並進の関係とホモグラフィー行列を書いてみましたが,下記の2がSource画像,下記の1がReference画像のイメージになります.

f:id:rkoichi2001:20190624183027j:plain
2画像間のホモグラフィー

ここで,上図の最後にR,Tとホモグラフィー行列の関係を書いてますが,平面の単位法線ベクトルNは座標系1に関しての表現を使います.次に,上図のホモグラフィー行列を使って,奥行きdmの仮想平面に対応する (u, v) の座標を求める式を導出します.

f:id:rkoichi2001:20190624185627j:plain
Reference 画像から Source 画像への変換.(ピクセルの対応関係)

で,論文(Real-time Plane-sweeping Stereo with Multiple Sweeping Directions)に乗っているホモグラフィーの式はグローバル座標系で求めているのでちょっと形が違います.ちょっとこの辺の座標変換がどうも慣れてなくて,だいぶハマったんですが,一応同じような形になりました.(が,ちょっと自信無しです.座標系の定義って,もっとはっきり書いてなくてもわかる人にはわかるもんなんですかね...)

f:id:rkoichi2001:20190624192132j:plain
論文のホモグラフィー式の算出

ということで,ひとまず主要部分はまとまったかと思います.次は実装編にいきます!