いぬおさんのおもしろ数学実験室

おいしい紅茶でも飲みながら数学、物理、工学、プログラミング、そして読書を楽しみましょう

写真から立体を再現(12)コマーシャル

 ここまで「写真から立体を再現」について、11回に渡って結構細かな話をしてきました。具体的にどんなことができるのか、お見せしましょう。言わばコマーシャルです。

f:id:Inuosann:20200422202934p:plain

上のような立体を作ります。上面に8の字が、手前の面には×が描いてあります。赤いマルで囲った点の空間内の座標は(0,0,1)、(1,0,1)、……であると決めておきます。どこか見えるところに座標軸があるわけではありませんが。この立体を角度を変えて2枚、写真を撮ります。カメラの内部パラメータ(焦点距離、その他)を変えないようにするため、1枚目で写真を撮るためにピントを合わせたらその状態は変えずに2枚目を撮ることにします。実際にこれで本当に「内部パラメータが変わっていない」と言えるのか分かりませんが、とりあえずやってみます。赤マルの点は2枚の写真に写っていますが、当然見え方が違います。この違いを数学的に扱うことにより、2枚の写真に写っている8の字を作る点、手前の面の×を作る点が空間内のどこにあるのか、座標を計算できるようになるのです。

f:id:Inuosann:20200422200544p:plain

f:id:Inuosann:20200422200606p:plain

実際に8の字と×が空間内のどこにあるのか座標を計算して散布図にしたのが次です。すべてPython(とNumpy)でやっています。確かに空間内の点として座標が求まっていることを見るため、クルクルと回した図を載せました。

f:id:Inuosann:20200422200704p:plain

 つまり、2枚の写真に空間内の座標の基準となる立体と再現したい立体が写っていれば、PC内で立体を再現できるのです。このブログで書いた「写真から立体を再現」の知識のみでできました。重要な役割を果たしたのは一般逆行列です。Pythonのコードや、理論をもう少し整理したらまた記事を書きます。

 基準になる立体を置かず写真のみでやる方法もあり、今後はそちらも頑張って調べたいと考えています。また、2枚の写真の対応点(「1枚目の写真のこの点は2枚目の写真のこの点に対応する」)は今回、ぼくがPCに教えました(マウスを使って)。これをプログラムでやろうとするとまた別の知識が必要です。

 

2020年4月24日(金) 追記:

ピントはマニュアルフォーカスにしました。そうしないとカメラが勝手にピントの調整をしてしまうからです。

2020年4月25日(土) 追記:

下線部について。この方法では内部パラメータが変わっても問題ないことに気づきました。写真の1枚目からカメラ行列を求め、2枚目からカメラ行列を求め、とやるのですが、その後の作業や結果は(カメラ行列から得られる)カメラの内部パラメータが一致しているかどうかとは全く関係ないのです。