Blenderで写真からDepth画像を出力する

今回は画像をDepth画像(奥行き画像:カメラから物体までの距離情報を画像にしたもの)を自動的に作成するシステムを開発しましたので紹介します。

作成したシステムの説明

今回必要なものは、同じものを角度を変えて映した複数の写真です。

なぜ複数必要かというと、VisualSFMを用いて形状復元を行っているからです。

VisualSFMについては、以前書いた記事を参照してください。

VisualSFMで画像から3次元形状推定する

上記の記事で使った画像を用いると、例えば

DSC 0581 300x225

みたいな画像を

DSC 0581

みたいな感じにすることができます。

カメラに近い部分が黒く、離れるほど白くなります。

手順

VisualSFMによる特徴点抽出

これについては以前の記事時を参照してください。

VisualSFMで画像から3次元形状推定する

Blenderにカメラと頂点データをインポート

頂点データ(.ply)は、上記記事と同じやり方です。

カメラデータは上記と同じやり方でも問題ありませんが、今回は上記の記事で使ったプログラムを修正したものを用意しました。

https://github.com/yosipy/Import_VisualSFM_cameras

こちらを使えば、読み込んだ画像と対応づいた名前の画像を出力できます。

使い方は同じです。

アドオンを有効化して、インポートします。

vsfm4

vsfm1

するとこんな感じに読み込めると思います。

vsfm2

カメラ名も対応づいているのが確認できます。

vsfm3

Depth画像を生成

アドオンがこちらです。

https://github.com/yosipy/Blender_Depth_Image

アドオンを有効化するとこんなメニューが出ます。

vsfm6

黄色での部分は頂点です。

頂点はレンダリングすることができないので、面を張る必要があります。

本来、点群を面に変換するには,点と点の接続関係を求めなければならず処理が複雑になってしまいます。

そこで、ここではそれぞれの頂点をCube上にすることで解決しています。

Cubeのサイズを指定して、ボタンを押すとこんな感じになります。

vsfm7

あとは、パラメータを設定して、デプス画像出力のボタンを押すだけです。

vsfm8

これで完成となります。

写真から奥行がわかってしまうなんて面白いですね。

忙しくて急ぎ足となってしまいました、すいません。。。