🌨️

点群処理の概要 (ツールやタスク、手法、センサ動向など)

2024/11/21に公開

点群処理って画像処理ほどの知名度が無いですよね。
本記事では、入門者向けに点群処理の世界観について説明していきます。

点群データって何なのか?

これが点群です。部屋の隅を計測した大量の点を引きで見ています。データはこちらから拝借しました。plyというファイルフォーマットで記録されています。[1]

点群データの実体

以下に先ほどのファイルの最初の部分を示します。[2]

//github.com/HuangCongQing/Point-Clouds-Visualization/blob/master/2open3D/data/fragment.ply

ply
format ascii 1.0
comment PCL generated
obj_info Generated by CloudCompare!
element vertex 196133
property float x
property float y
property float z
property uchar red
property uchar green
property uchar blue
property float nx
property float ny
property float nz
end_header
0.652344 0.846865 2.378906 0 0 0 -0.528379 -0.086876 -0.844552 # First line
0.652344 0.839844 2.384306 0 0 0 -0.475044 -0.205303 -0.855678 
0.667380 0.839844 2.378906 0 0 0 -0.920070 -0.094052 -0.380296 
0.660156 0.846620 2.378906 0 0 0 -0.156301 -0.675283 -0.720807 
***

plyからend_headerまでの部分がヘッダーで、メタデータが記録されています。end_header以降がデータの本体です。データ本体の1行目、First lineに着目すると、[0.652344 0.846865 2.378906]が点座標、[0 0 0]が色情報、[-0.528379 -0.086876 -0.844552]が恐らく法線ベクトルです。ここには4点分のみの記載ですが、ヘッダーにはelement vertex 196133とありますので元のデータでは196133点分のデータが記録されており、それを表示すると先ほどの部屋の隅を見ることが可能になります。

さて、この記録方式から分かることとして、点群データは画像データよりも空間方向の制約が緩いです。なんでもありです。つまり、隣接点の探索や、点群全体の空間サイズの把握が容易ではないということが言えます。個人的には、ここが画像処理との大きな違いであると考えています。

他の3次元表現との比較

点群の他にも3次元情報を記述方法はあります。

  • ボクセル
    下図のように画像データを3次元拡張したフォーマットです。医用CT画像でよくみるフォーマットです。このフォーマットでは、隣接点の探索や全体の空間サイズが容易になります。

    https://medium.com/@julie_93447/3d-learning-its-time-to-teach-in-voxels-instead-of-pixels-d644df659328

  • ポリゴンメッシュ
    ポリゴンメッシュは点間を多数の三角形で接続したモデルを指します。点群をポリゴンメッシュに変換することで面が得られます。面に対して画像や色を割り当てることで背面が透けて見えない3次元モデルが得られたり、有限要素解析が適用可能になったりします。Plyファイルではポリゴンメッシュを記録することも可能です。

    https://www.mdpi.com/1424-8220/22/18/7040

点群ビューワー

まずはビューワーです。
人間は見えないものを考えられませんよね。

私はCloudCompareが手に馴染んでいるので、こちらをお勧めとしてご紹介します。先ほどの挿絵もこれで表示しています。GPLライセンスです。

https://github.com/cloudcompare/cloudcompare?tab=readme-ov-file

CADソフトのようにグルグル回したり、拡大縮小や移動は直感的にできます。点群ビューワーの中でも軽量な部類と思います。

https://youtu.be/MQiD4HjhpAU?t=137

また、各点に対して付与されたスカラー値の表示や、RGB値の表示なども可能です。


https://www.danielgm.net/cc/

点の間引きや点群の座標変換などの汎用的な点群処理も可能です。

点群処理タスク

以下の概要図が分かりやすく、一覧性があります。

後述する点群処理ライブラリのHPからの引用です。

主要なところを解説します。

  • filters(フィルタ): 点群データからノイズや不要な点を除去し、データを整えるための処理。
  • features(特徴量): 点群データから形状やパターンを表す特徴的な情報。
  • keypoints(キーポイント): 点群内の特徴的な点や重要な位置。
  • registration(位置合わせ): 複数の点群データを同一の座標系に統合するために位置や姿勢を調整すること。
  • kdtree(KDツリー): 点群の近傍探索を効率的に行うためのデータ構造。画像のように画素座標のインクリメントでは済みません。
  • octree(オクトツリー): 3次元空間を再帰的に8分割して管理するデータ構造で、空間の分解や索引に使われる。
  • segmentation(セグメンテーション): 点群データを意味のある部分やオブジェクトごとに分割する処理。
  • sample_consensus(サンプルコンセンサス): 外れ値を含むデータからモデルを推定する手法の一つで、RANSACなどが含まれる。
  • surface(表面再構成): 点群から物体の表面を再構成し、連続的なメッシュやサーフェスを生成すること。メッシュは点間を接続し、表面を三角形で表現したデータを指します。サーフェスはメッシュで接続された線間を面として埋めたデータを指します。
  • recognition(認識): 点群データから特定の物体や形状を検出・識別する処理。

概要図以外からは、以下の通りです。

点群処理関連ライブラリ

  • Point Cloud Library (PCL)
    古くある点群処理ライブラリです。C++版が標準です。BSD3条項ライセンスです。

https://github.com/PointCloudLibrary/pcl

  • Open3D
    比較的新しい点群処理ライブラリです。C++が基本実装ですが、Python対応に積極的です。PCLよりもタスクの守備範囲が広い印象があります。MITライセンスです。

https://github.com/isl-org/Open3D

  • potree
    とても軽量な Webレンダリングライブラリです。

https://github.com/potree/potree/

表示例はこちらです。WebGL利用や表示点群数の縮約による高速化が行われています。

https://www.eth3d.net/view_multi_view_result?dataset=20&id=1358&tid=2

最近の動向

最近の手法動向

2024/06/10時点での最新手法の動向マップが以下にまとられています。
https://ssii.jp/ssii/files/2024/technology_map/SSII2024_map_3D.pdf

ちなみにこのマップの作成者は、唯一?の日本語の点群処理書籍の著者の方です。書籍ではOpen3Dが採用されています。

最近のセンサ動向

LiDARセンサの方式

点群情報を直接的に取得するには、LiDARセンサが使用されます。(逆に間接的にというのは、例えば画像から点群情報を推定した場合などを指します。)
以下の説明では、こちらの論文の図を拝借しています。

LiDARでは、以下の図のように対象物に対して光を当てて、その光の飛行時間を計測することで対象との距離を計測しています。ToF(Time of Flight)と検索すると様々な説明が出てくると思います。

LiDARには様々な方式があります。上図の青枠部分の具現化方法になります。現在ではコストの観点からMechanical方式とMEMS方式が多くの場面で採用されています。しかし、可動部を持つことに由来する耐久性の低下が問題視されており、FLash方式やOPA(Optical phased array)方式が研究開発されています。(他にもそれぞれメリデメあります。)

カメラ‐LiDARフュージョンセンサ

https://www.kyocera.co.jp/newsroom/news/2024/002595.html,

直近のニュースで目にしたので記載します。カメラとLiDARの光軸を合わせたセンサーです。LiDARは正確な点群情報が得られる一方で色情報が得られません。色情報はカメラで取得するため、これらのセンサ間情報のマッチングを取る必要があります。このセンサを用いることで、マッチング処理の高速化・精緻化が期待できます。

おわり

以上です。随時追記していくかもしれません。

画像からの3次元再構成については別途記事を作成したいと思います。

脚注
  1. 点群やメッシュを記録可能なファイルフォーマットは複数あります。相互に変換可能なフォーマットも多いです。他のフォーマットについては例えば、こちらを参照ください。 ↩︎

  2. 実際にはこちらのデータは、ヘッダより後の部分がバイナリフォーマットで記録されています。本記事ではファイル全体をASCIIに再変換した結果を使用しています。 ↩︎

ヘッドウォータース

Discussion