Edited at

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

More than 1 year has passed since last update.


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終わってしまったので、課題手を付ける予定は未定です(すみません)