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

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

新・写真から立体を再現(6)ちょっとCM。2枚の写真から立体を一応再現する。

 CMです。細かい話はとりあえず後回し。「おおっ、パソコンと数学を使ってこんなことができるのか!?」と思っていただければO.K.です。

 角度を変えて撮った2枚の写真に立体が写っています。基準となる立方体などは写っておらず、対象の立体だけです。ある程度でよいなら、これだけでもとの立体を再現できます。計算もラクです。紹介しましょう(なお『新・写真から立体を再現』シリーズで書いているのは(まだ途中ですが)基礎行列Fを求め、Fからカメラの内部パラメータを求め、…とやる、隙のない方法です)。「数メートル離れた人物」などを撮るときは、下の式が近似的に成立するとみてよいようです。

f:id:Inuosann:20200514093808p:plain
厳密には下の式のように空間の点ごとに異なる係数がかけ算されるためこんな単純にまとめられません。空間の点と写真上の点の対応の式です。係数sがかかっていますが、これが点によって変わるのです。前、ブログで書きました。 

f:id:Inuosann:20200513204812p:plain

www.omoshiro-suugaku.com

 さて、ここでは「近似的に成立する」式を使ってみましょう。示した式は10点を相手にするときのものですが、今回の例では2枚の写真を使い、25点を対象にしています(写真を3枚使うこともできます。式のどこをどう変えたらよいかはお分かりでしょう)。2枚の写真から左辺の行列を作ることができます。これをWと表すことにしましょう。W=MSとかけ算に分解して、Sの部分から空間点を得られます。ただ、実はこの方法では(近似式を使っているので仕方ないのですが)立体を正しく再現できません。実際、今回の実験で得られた結果でも角度がいい加減になってしまっています。かけ算への分解には特異値分解を用います。

f:id:Inuosann:20200513211137p:plain

と考えてSから空間点を得るのです。実験結果を見てみます。使った写真は以下の2枚。マジックで打った点の写真上での座標を(マウスで拾って)入力して空間点を計算します。使った言語は例によってPythonです。コードは少しきれいに直していずれ載せます。

f:id:Inuosann:20200513184719p:plain

f:id:Inuosann:20200513184421p:plain

空間内に点が打たれていることをお見せするため、散布図を少しずつ回して9枚の図にしました。空間の中での点の配置を想像してください。

f:id:Inuosann:20200513184113p:plain

ティッシュBOXの上面(×印の乗っている面)と側面(6点乗っている面)は直交しているはずですが、再現した図ではそうなっていません(90°より小さい角になってしまっている)。しかし簡単な計算の割にはまあまあちゃんとしてるではないですか!!

 例えば、「ここは直角になる」など、必要な事実を式に反映させればちゃんとなるようです。(宿題はどんどん増えていますが)これもいずれ。今回参考にしたテキストは次です。 

線形代数セミナー: 射影,特異値分解,一般逆行列

線形代数セミナー: 射影,特異値分解,一般逆行列

 
3次元コンピュータビジョン計算ハンドブック

3次元コンピュータビジョン計算ハンドブック

 

 いろいろ、勉強になります。つくづく感じるのは数学って凄い、ということ。パソコンも凄い。この程度のことなら(何度も書いていますが)どこかにライブラリがあって、全く苦労なしにもっとよい結果を出せることでしょう。しかしそれを100回繰り返したところで何も頭に残りません。実験室レベルでよいですから自分で理論を勉強してコードを書いて、模型を作って写真を撮って、……とやるに限ります