ここのところ、「2枚の写真から立体を復元する」というテーマで勉強しています。前、それなりに時間をかけてやっており、そのとき書いた記事も結構あります。
今回、もう少しきちんと勉強して知識を整理しておこうと思いました。
ひとつの立体を異なるアングルから写真を撮ります。同じカメラでも、2つのカメラを使っても構いません。できあがった写真2枚を見れば、もとの立体がどんな形なのか人間は何となく分かりますよね。恐らく数学的にきっちりもとの形を求めることもできるでしょう。面白そうなテーマではありませんか!?
しかし、意外というか立体を求める手順の中に面倒な部分があるのです。「えっ、こんなに大変なの?」という感じ。雰囲気だけですが、ちょっと考えてみるともとの形は理屈で求められるに決まっていそうです。しかし、なかなかそう単純な話ではない、ということなのです。だから面白いのだ、とも言えるわけですが。
さて、この理屈の中に基本行列(Eで表す)、基礎行列(Fで表す)というのが出てきます(どちらも3行3列)。「基本行列」という用語は線形代数で最初に出てきます。行列の基本変形に使う行列を言うのでしたが、今回話題にする基本行列はこれとは違います。
カメラA、Bでひとつの立体の写真を撮ります。立体の特定の頂点をPとしたとき、PはAで撮った写真にもBで撮った写真にも写ります。Aの写真上では座標(画像面上での座標)が(u, v)、Bで撮った写真上では(u', v')であるとするとき、実は次が成立するのです。エピポーラ方程式と言います。
Eは3行3列の行列です。一方のカメラをどのように移動し、どのように回したら他方にピタッと重なるのかを表します。実はこのEは次のように書けます。
Rは、とある直交行列(ランク3)です。ここで問題。行列Eのランクを考えてください。ただしa, b, cの中には0でないものがあるとしておきましょう。
両辺の行列式をとれば
となりますから、結局
のランクを求めればそれがEのランクです。
行列Aの小行列式を調べ、3次のものが(すべて)0ならランクは2以下です。|A|を1行目について展開すると
|A|= -(-c)(-ab)+b(ac) = 0
となりますから、ランクは2以下と分かります。
次に、2次の小行列式を調べ、0でないものがあることを確認します。a,b,cには0でないものがあるのですから、例えばa≠0としてみます。このとき0でない小行列式があります。次です。
だからAのランクは2以上です。
これで分かりました。Aのランクは2です。理屈はこれでよいのですが、何だか不思議でもあります。カメラの移動、回転を表す行列がなぜかランク2と決まっているわけです……。
この分野の日本語のテキストはいくつかありますが、ぼくが主にお世話になっているのは次です。
また、次の本も読んでいます。この分野にクルッパ方程式というのが出てきます。『写真から作る3次元CG』には線形代数だけを使った導出が載っています。同じ著者ですが1冊目の『3次元ビジョン』ではクルッパ方程式を導くのに射影幾何を使っており、ぼくには理解できませんでした。
英語の本なら多そうなので頑張って読んでみたいところです……。