CrossRoad

XRを中心とした技術ブログ。 Check also "English" category.

【2020/9/12 Unityプロジェクトを追加】ARCoreで保存したPoint Cloudを色付きでUnityに出力しました

前回、ARCoreのPoint CloudをAndroidスマートフォンに保存する方法を紹介しました。

【Unity】任意のパスにARCore Point Cloudの値をcsvで書き出す - CrossRoad

今回は、Point Cloudに一致する色情報を出力する方法をまとめました。なお、以下の環境で動作を確認しています。

  • Unity2017.4.4f1
  • ARCore SDK 1.2.0
  • Android 8.1.0




1. Point Cloudとは?

整理も兼ねて、ここから説明したいと思います。WikiPediaの説明がわかりやすいです。

点群(てんぐん)やポイントクラウド(英: point cloud)とはコンピュータで扱う点の集合のこと。多くの場合、空間は3次元であり、直交座標 (x, y, z) で表現されることが多い。

引用元:点群 (データ形式) - Wikipedia

個人的には、Point Cloudはレーザによる3次元測定、モデリングと一緒に出てくることが多い印象です。

レーザによる3次元測定、モデリングの場合、対象物に射出したレーザの反射一つ一つがそのまま点の集合となります。これをPoint Cloudと呼びます。

1つ1つの点に色をつけたり、点を繋いでメッシュにすることで、Unityでも使えるような3Dモデルデータに加工することが可能です。


一方、ARCoreを使う場合、特徴点の集合をPoint Cloudとしています。特徴点の説明もWikipediaを引用します。

コーナーとは2つのエッジの交点と定義することができる。コーナーは、ある局所近傍で方向の異なる2つの際立ったエッジが存在するような点と定義することもできる。特徴点とは、際立って検出できる画像上の点のことをいう。これは、特徴点がコーナーになれるということだけでなく、例えば、強度が極大・極小の点、曲線の終点、あるいは曲率が極大である曲線上の点、といった孤立点でもあることを意味する。

特徴点とは、具体的には、この画像の水色で示されるような点のことです。

ARCoreで検出する特徴点の例

この画像からわかるように、点として検出するのは、あくまで対象物の特徴的な箇所のみです。

2. Point Cloudに色をつける方法

途中まで調べて作っていたのですが、Unityのブログに方法が書いてあったのでこちらを参照しました。

blogs.unity3d.com


2-1. ARCoreのSDKをUnityにインポート

ここは説明を省略します。ARCoreのSDKは下記のページよりダウンロードできます。

Quickstart for Android  |  ARCore  |  Google Developers

2-2. Hello ARシーンをコピー

Assets/GoogleARCore/Examples/HelloAR/Scenes/HelloAR.sceneを開き、Save Scene asで別の名前で保存します。

以後はここで保存した別の名前のシーンを使います。



2-3. 空のGameObjectにFeature Point Colors_save.csをアタッチする

gistc88b8d0bd7cc337433e94e8de1b86243
(長いのでブログでの表示はしていません。リンクをクリックしてご確認ください)

これは参照したブログ記載のソースコードをベースにしています。ただし、そのままでは動かなかったので少し修正し、point cloud を色付きで保存する処理を追加しました。

2-4. Instant Previewまたは実機デプロイして動作を確認する

先ほど追加したFeature Point Colors.csによって、以下のように特徴点に色がついた状態になります。

point cloudにcolor情報を追記した例

また、スマートフォンには、このように特徴点のx,y,z座標に加えて、R,G,B,Aの情報が1秒おきに保存されます。

point cloudのx,y,z座標とR,B,G,A情報を保存したファイルの例

3. 保存してUnityで確認する方法

先ほど保存したcsvファイルを使います。csvファイルをUnityプロジェクトのResourcesフォルダに入れて、新しく以下のスクリプトを作ります。


gista75e00b9bc38fa22a3ce33b49b62d963


なお、CSV形式での保存方法については、こちらを参考にさせていただきました。ありがとうございます。

【Unity】CSVファイルのデータを取り込む – TJ日記

このスクリプトを適当な空GameObjectにアタッチしてシーン実行すると、このように特徴点1つずつをマテリアル付きのcubeで表現します。

ARCoreのPoint Cloud情報に色をつけてUnityで表示した例

ARCoreのPoint Cloudに色がついた時の例。Unity表示と対比用

Unity側の右下半分のCubeの並びが、画像とだいたい合っていることが確認できます。

4. (2020/9/12 追加) Unityプロジェクト

この記事だと動く形が作れない可能性があったので、過去のUnityプロジェクトを調整してGitHubにあげました。

github.com

以下の環境で動作することを確認しています。

  • Unity2017.4.4f1 on MacOSX 10.15.6
  • ARCore SDK 1.2.0
  • Android 10.0


5. 終わりに

画像処理関係はあまり詳しくないので、Point Cloudも含めて色々勉強になりました。今回の方法は何かしらの演出などに使えるかもしれないですね。