立体の復元、一応ここまでで書いた理屈は全てプログラムで試してみました。しかし、結果は×でした……。結構時間かけたのに……。
写真3枚から内部パラメータ行列Aを求めようとするとき、次の式を使います。
ブログではBを(測定によって)求めてからこの式を使ってAを求めるのにかなり面倒な手順を書きました。ここで、コレスキー分解というのがあったのでした(Bを三角行列の積に分解できる。Numpyにあります)。しかし、多分誤差などのためだと思うんですが、分解できないことがあるのです。対称行列Bは正定値(固有値が全て正)でないとコレスキー分解できません。が、測定の誤差でこの条件が満たされないことがあるのですね。コレスキー分解できてAが求まったときも、ブログに書いた面倒な手順で計算したAとは異なっていました。
もうひとつ、基礎行列Fを求めるのも理論的には2枚の写真で対応する8点の写真上での座標が分かればよいはずなのですが、Fのランクが2になるようにFを修正するとエピポーラ線が正しく得られません。
さらに、Aを変化させないよう、スマホのカメラをマニュアルフォーカスで写真を3枚撮るのですが、Fはそのうち2枚あれば分かります。しかし1,2枚目から計算したAは2,3枚目から計算したものとは異なっていました。
もう、どこが正しくてどこが誤っているのか何とも分からず、疲れ果てて実験は諦めました。理屈はしっかり理解したつもりなのでその点はよかったけれど……。
しかし、下のような立体を相手にした写真2枚からもとの立体を再現するのはすぐできました。対応する6点から射影行列を求めることはできるのです。Fの計算で「誤差が……」などということならこっちだって同程度の誤差はあるはずなんですが。
何にせよ、とりあえずここまででひと区切りとします。よく勉強しました……。