Tech Sketch Bucket of Technical Chips by TIS Inc.

kinectで物体の3Dスキャンを試してみたよ1

Pocket

kinectなどの安価なDepthセンサを利用して3Dスキャンをしようというソフトウェアが世の中には存在します。
今回の記事ではkinectを利用した3Dスキャナーのソフトウェアを試してみました。


3Dスキャンをするアプリケーション

KScan3D http://www.kscan3d.com/Artec http://www.artec3d.com/ja/ など安価なdepthセンサであるkinectやXtionなどで3Dスキャン可能なソフトウェアが出てきています。
今回の記事では「試してみてこんな感じだった」という軽い感じでまとめて見ます。

KScan3dを動かしてみるよ

今回の記事ではKScan3dを動かして3Dスキャンを実行してみます。

動作環境

要求されるハードウェアは こちら で、
今回はこのような実行環境で試しました。

  • Windows7 64bit
  • CPU Intel® Core™ i7 CPU 870 @2.93GHz
  • メモリ 6GB
  • グラボ ATI Radeon HD 3450
  • センサー
    • kinect for xbox360
    • Xtion PRO LIVE(記事中のデータはこちらで作成)

sensors.jpg

Xtion PRO LIVE/Kinect for XBOX360

インストール時の注意点

http://www.kscan3d.com/download/ からインストーラを取得してインストール。
普段開発にも利用している端末だったのでドライバ周りで問題が発生しました。
デバイスマネージャからドライバの更新をしてインストール時についてくるドライバを使いましょう。

スキャンをはじめる

動作手順などは Tutorial を参考に、スキャンをしていきます。
流れとしては以下のような感じでやっていきます。

  1. スキャン対象を配置
  2. 対象をさまざまな方向からスキャン
  3. スキャン結果を重ねる
  4. スキャン結果を整理
  5. ファイナライズ

このKScan3Dは複数の方向から撮影したRGB画像と深度画像を複数用意して、適切に重ね合わせることでモデルを作成する手順になります。

スキャン対象を配置

本日の撮影対象はこちらの普段座っている椅子です。

chair.jpg

今回はできるだけ全力で3Dスキャンをしようと努力して見ます。
椅子を360度全方向&上下から撮影できる程度の場所に配置しました。
スキャン後の結果を重ねる処理のことを考えるとスキャンの途中で対象を別の場所に移動したり、椅子が回転したりするのはよくないと思われます。

対象をさまざまな方向からスキャン

さっそくアプリケーションを起動して撮影対象を撮影していきます。
まずは1枚目をスキャンします。
capture_002_24012013_162135.jpg

スキャンしたところ

撮影したモデルをマウスでぐりぐりすると回ります。
次に2枚目をスキャンします。

capture_003_24012013_162201.jpg

2枚目をスキャンしたところ

早速1枚目と2枚目が適切に重なっていないので椅子が分裂しています。2枚目をスキャンした時点ではスキャン時に自動的に重ねあわせをするチェックをいれているのですが、(左上のMeshing内のAlignmentの項目MeshGeometryのところ)うまく重ならなかったようです。
重ね合わせのずれを直しながらスキャンを実施してもよいのですが、今回はAlignmentの設定をNoneにしてスキャン時の自動調整をしない設定とした上で重ね合わせをする前に大量にスキャンしていきます。

capture_004_24012013_162232.jpg

3枚目をスキャンしたところ



スキャン中

capture_005_24012013_162633.jpg

28枚目をスキャンしたところ

結構な数のスキャン結果ができています。
プレビュー領域がもはや何なのかわかりません。

スキャン結果を重ねる

この大量のスキャンデータを適切に重ねていきます。
この部分が一番大事だと思われます。

まずは1枚目と2枚目のScanデータだけ表示して、ほかを非表示にします。
撮影したデータの左側のチェックボックスをOFFにすると非表示になります。

capture_006_24012013_162843.jpg

2つのスキャンデータだけ表示

直前の画像のようにスキャンのデータの位置がある程度近い状態であれば、画面上部のAlignを押すだけでぴったり重ねることができます。
というわけでAlignボタンを押下したのがこちら。

capture_007_24012013_162857.jpg

Alignした

見たところぴったり重なりました。
Alignされたスキャンデータはロック状態になります。ロック状態になると手動での場所移動ができません。画面上部のボタンで解除したりUndoしたりしましょう。

Alignによる自動の重ね合わせ処理はある程度同じ領域を重複して撮影しておかないと正しく動作しません。その点は考慮しながら最初にスキャンしておきましょう。(もちろん後で撮影してもよいですが)
Alignボタンの自動処理で適切に重ならない場合は手動である程度近づけた上でAlignボタンを押すことで適切に重なっていきます、どうしてもうまくいかない場合はほかのデータを重ねてからにするか、1枚や2枚重ねなくてもどうということはないと開き直ったりしてみてください。

これらを念頭に必要なスキャンデータをひとつひとつ重ねていきます。

capture_009_24012013_163215.jpg

画面表示をPointsにすると手動の調整がやりやすい

capture_011_24012013_164824.jpg

Points表示

capture_012_24012013_164836.jpg

Textured表示

こつこつ重ね合わせ処理をした結果こんな感じのデータになりました。

capture_020_24012013_172341.jpg

まとめた結果

スクリーンショットのタイムスタンプを見る限り25枚程度重ねるのに(数枚捨てました)大体1時間かかったようです。
利用歴1日の人間でこの程度なので重ね合わせ作業やスキャン数を減らせるよう習熟すればもっと早くいけるのではないかと思います。

スキャン結果を整理

スキャン結果を整理していきます。

まずは重ねあわせを完了させたスキャンデータをCombineすることでまとまったデータになります。
Ctrlを押しながらマウス操作をすることで特定の領域のスキャンデータを削除できます。

これを利用して椅子の部分以外の不要なデータを切り落とします。
その結果こんな感じになりました。

capture_022_24012013_173624.jpg

スキャン結果

ちゃんと椅子っぽくなりました、表面の質感が気持ち悪い感じですが複数の方向から撮影しているのでスキャン対象の同じ部位でも違う色のデータが存在するせいです。何とかならないかな。

capture_002_25012013_114215.jpg

スキャン結果(裏側)

rgb.jpg

椅子の裏側画像

椅子の裏側のハンドルの棒や細かい部分は完全再現とはいきませんが、ある程度正しく取れてるようです。

ファイナライズ

この時点ではまだモデルとしては不完全です。
上のボタンのFinalizeを押下するとひとつのモデルとして出力されます。
Finalize押下時には若干のパラメータ指定があります。
モデル内の点の密度、穴埋め、間引きの設定ですが、適当に出してみればよいと思います。
Finalizeでは上記の設定が反映されモデルの外観が若干変わります。

capture_003_25012013_151104.jpg

Finalize時にDecimate=5%指定

capture_004_25012013_151149.jpg

Finalize時にDecimate=60%指定

これらのスクリーンショットのようにFinalize時にデータ量を減らすのはほどほどにといったところのようです。
このデータをエクスポートすれば通常の3Dデータ(.3d3 .asc .obj .ply .stl .pbx)として利用可能です。
それぞれ出力時の データの制限 があるので利用するのに適切な形でexportします。ただしexportはライセンスを買わないと使えないようです。

向いてなさそうなこと

実際に存在するものを3Dモデルとして取り込むことには成功しましたが、向いてないような内容もあります。

表面が金属質のものはスキャンできない

記事のここまででスキャンしてきた椅子ですが後ろ側に金属部分がありますが、その部分はまったくスキャンされませんでした。

capture_002_25012013_160621.jpg

金属部分消失

kinectなどの性質上当然の結果ではあります。

入り組んだところがスキャンできない。

近づけすぎるとdepthが取得できなくなるので入り組んだ部分をスキャンすることは難しいです。
今回の椅子の例でいうと、足の5又に分かれている部分の裏側や椅子の裏の細い部品などはあきらめています。

小さなものには向いてない

小さなものをスキャンするために近くから撮影したいですが、センサの仕組み上近くすぎるもののDepthは取得できない&精度もそれほど高精度で取れるわけではないのでそれなりに大きめの物体が対象になるでしょう。

まとめ

というわけでKScan3Dで3Dスキャンをやってみました。
現実に存在する物体を完全に再現するにはいたりませんが今まで高コストでなかなかできなかったことが可能になったという点で非常に面白いと思います。

エンジニア採用中!私たちと一緒に働いてみませんか?