現在、また「何枚かの写真に写った立体をPCで再現する」というテーマで理論の整備、実験をしています。具体的には、立体の写真(建物の写真、家具の写真、……)を何枚かPCに渡して、PC内でそれらの立体の頂点の座標を計算します。そうすればPC内でその立体を回転(空間内の回転)することもできるようになります。
前にはその写真の中に立方体が一緒に映り込んでいることを仮定してやっていました。そうすれば、この立方体の写真への写り具合からカメラの校正(カメラ内部のパラメータ、カメラの向き、位置を得る)が一度でできるからです。しかし、考えてみれば(そして実際に実験をやってみれば)「その辺の建物や家具を写真に撮る場合、立方体は大抵写っていない」とすぐ分かります。そこで……立方体の代わりにチェスボードで校正する、という方法があります。平面に規則的に正方形が並んだ、チェスボードのようなものが写っていればOK。建物などでも繰り返しの構造は多く、こんなのを利用できれば必ずしも「正方形」でなくても大丈夫です。要するに縦横に規則的に何かが並んでいればよいのです。
詳しくは次回以降に順番に書いてゆきますが、チェスボード上の座標を写真上の点の座標に対応させる行列H(3行3列)を求め、Hからカメラの内部パラメータ行列A(3行3列)を求め、最後にカメラの外部パラメータ(カメラの位置、向き)を求めます。この状態からなら、写真に写っている建物の頂点から実際の空間内の座標を求めることができます。使っているテキストは何回か紹介している、これです。
簡潔だと思うのですが、計算など省略されている部分もあり、自分で行間を埋めました。実験はこれからです。スマホのカメラと、Pythonでやってみます。このブログの記事を読めば理屈の理解、実験ができるように整理しておく予定です。なおPythonのライブラリにはカメラの校正をしてくれるようなものもあり、それを使ってしまうのもひとつの方法です。しかしそうしているうちはカメラの校正の原理、立体の復元の原理など理解できません。連立方程式の非自明解を求める(Av=0を解く)くらいはライブラリを使いますが、基本的には自分の頭だけ。
復元の理屈の部分は整備し終わっていますが、つくづく感じるのは難しさです。チェスボードの写り方からカメラの基本的な情報(カメラの位置、向きなど)が何かの方法で計算できるであろうことはイメージできます。しかし実際の計算は「え、それだけのことで何でこんなに大変なの?」という感じなのです。そういう部分が面白いとも言えるのですが。夏休みも近いですし、がんばってやってみます。