43
27

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

HoloLensで部屋の3Dスキャン試してみた

Last updated at Posted at 2017-05-07

HoloLensで部屋の3Dスキャン試してみた

tango 凄い!しかし HoloLens だって…。

  • 先日、twitterで以下の話が出てました。
  • tangoは低レベルでPoint Cloudデータ(点群データ)取れるらしく、こういうアプリがあるそうです。
  • なのでHoloLensで同じ事できないか?と思いテストしてみました。

    (もし、既にHoloLensでこういったアプリがあったら教えてくださいっ!)

Special Mapping をそのまま利用する?

HoloLensの Special Mapping データ(点群)を取り出す(Natural Software)

  • 最初に上記ブログを見たのですが、HoloLensの空間認識は単色ポリゴンで行ってるようで、
    グレイスケールで思ってたのと違いました。
    (すいません)

Locatable camera を使う?

Locatable camera in Unity(Microsoft Windows Dev Center)

  • twitterで色々聞いたりして、このサイトにたどり着きました。
    こちらによると、フォトキャプチャで3つの事ができるようです。
  1. ファイルに写真を取り込む
  2. テクスチャ2Dに写真を取り込む
  3. 写真を撮影し、生のバイトデータを取得する
  • 1番はjpegファイルが作成できますが今回の目的とは違います。
  • 2番は表示ができるようになります、以下のような表現もできるようです。
    Holographic Photo Blending with PhotoCapture(forum.unity3d)
    ですが、このような記述を見て心おれました。
- 3番は色情報をそのまま取れるようで、2番がダメでもこっちなら都合良くできそうです。

Point Cloud データの表示

Point Cloud Free Viewer(unity asset store)

  • このassetをそのまま使おうかと思ったら、事前処理?が必要そうでうまくいきませんでした。
  • assetからは頂点カラー表示のshaderだけお借りして、以下のサイトを参考にRawDataからmeshを作成しました。

UnityでPoint Cloudを表示する方法(NegativeMindException)

写真を撮影した方向にPoint Cloud データ表示

  • 先程作成したMeshデータを表示する際、カメラの向きに応じた座標変換が必要になります。

  • 理論的な事はここに書いてあるようです。
    Locatable camera(Microsoft Windows Dev Center)

  • 理論はとにかく、実際の座標変換コードはさっき提示したここに載っています。
    Holographic Photo Blending with PhotoCapture(forum.unity3d)

  • めっちゃ簡単に言うと、 photoCaptureからTryGetCameraToWorldMatrixでカメラの方向とってそれを反映するだけです。

  • こんなカンジに表示されるようになりました。
    camera01.jpg

※画像はunity上のイメージで、実際の部屋とは関係ありません。

Point Cloud データをSpatial Mapping の表面に張り付ける。

  • これは皆さんお馴染みの、RaycastでカメラからPoint Cloud方向へ地形判定して、当たったらSpatialMappingと判定して座標移動、外れたらPoint Cloud捨ててるだけです。
  • こんなカンジで地形に沿うようになりました。
    camera_anim01.gif

※画像はunity上のイメージで、実際の部屋とは関係ありません。

座標系を合わせる(5/9追記)

  • そういえば、出力したPoint Cloudが何故か左右逆だった時がありました。
  • 理由もわからずとりあえず左右逆転しておいたのですが、つい先日理由が判明しました。
PointColorList.Add(String.Format(" {0} {1} {2} {3} {4} {5} {6}\n",
                                 -PointAll[i].x, PointAll[i].y, PointAll[i].z,
                                  ColorAll[i].r, ColorAll[i].g, ColorAll[i].b, ColorAll[i].a));
  • なので、上の謎のマイナス記号は察してください(多分off形式の座標系が違う。)

Point Cloud データをファイルセーブする。

HoloLensでのアプリからのファイル書き込み(Natural Software)

  • 上記ブログを参考に、MeshにせずListに残しておいたPoint Cloudデータにヘッダつけて、*.off形式のファイルとしてセーブしています。
  • いつソフトが落ちても大丈夫なように、途中経過毎回全部セーブしてます、無駄ですみません…。

MeshLab で Point Cloud データを表示する。

  • *.offファイルはMeshLabで簡単に表示できます。
  • こんなカンジで、HoloLens単体で3Dスキャンした物体をカラーで表示一応できました。
    ueno_panda01.jpg

ソースコード

  • 以下に置きました。
    HoloPointCloud(GitHub)

  • まだ試した方いないので、ファイル不足していたら追加します。

実行ファイル

今後の課題

  • 移動しながら撮影していると、どこかの誤差から少しづつ座標がずれてる気がする。(要検証)
  • カメラの露出で色が不安定になるので露出固定して撮影したい(今はライティングでカバー)
  • 適当にmesh作成してるだけで落ちるので、もっとunityの状況(描画やメモリ)を調べてエラーで落ちないようにする。
  • point cloud データが重なって無駄な部分を削除する。(MeshLab上でできますが)
  • 点群データの座標の倍率、実は見た目で合わせたマジックナンバー入ってます(200)これを、カメラからの距離(正規化されたfrontなので多分1m)と画角と解像度から、正しく計算した値に直す。
  • Point Cloud の密度がカメラ全体でmeshが落ちない65000以下で最大と適当なので、例えば撮影範囲の中心だけ使って高密度とか、もっと速度重視の低密度とか、色々試してみたい。(数値65000に修正しました)
  • ファイルセーブが手抜きすぎるのでDocumentにoffファイル関連付けてロードもできるように改造すべき。

GW終わってしまったので、課題手を付ける予定は未定です(すみません)

43
27
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
43
27

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?