「点群(Point Cloud)」は三次元データ表現手法であり、多数の三次元座標点で構成され、これらの点が共同で物体やシーンの表面を表現するものです。近年、点群技術は工場でのレイアウト把握やデジタルツインを実現するための技術として注目を集めています。
本記事では点群の基本知識として、データの特徴や課題、フォーマットについて紹介します。
点群データの作成方法
点群データは通常、以下の方法で取得されます。
- レーザースキャナ(LiDAR)
レーザーパルスを発射し、その反射時間を測定することで環境の三次元情報を取得します。通常は色情報なしです。レーザーパルスを使っているため、長距離・屋外環境に対応できます。
- 構造光スキャナ
構造光パターンを投影し、その変形を分析することで三次元情報を取得します。カメラ画像と組み合わせれば色付き点群も可能です。ただし、表面が透明・反射的・暗色などだとパターンの投影・認識が難しくなります。近距離の高精度の部品によく使われます。
- ステレオビジョン
複数のカメラで物体を異なる角度から撮影し、画像マッチングと三角測量によって点群を生成します。元が画像なのでRGB色情報があります。画像特徴が乏しい・繰り返しパターンが多い・影や照明変化がある環境では、深度推定が不安定になりやすいです。低コストのため、ドローンなどの広範囲の測量に使われます。
- RGB-Dカメラ
マイクロソフトのKinectなどがあります。カメラがカラー画像と深度情報を同時に捕捉し、点群を生成するため、リアルタイムに色情報が付いています。一般にレンジ(取得距離)や深度の精度・ノイズ、および視野・画角に制限があるため、室内用途が多いです。
点群データの構造と特徴
点群データの構造
点群データの各点には通常、以下の情報が含まれます。
- 位置
三次元空間における座標(x, y, z)。
- 属性(オプション)
色(RGB)、法線ベクトル、反射強度などの追加情報を含む場合があります。
- 反射強度(Reflectance Intensity)
点群データにおける重要な属性であり、通常はレーザースキャナ(LiDARなど)によって取得されます。これはレーザーパルスが物体表面に到達した際に返されるエネルギー強度を表します。反射強度は材料、色、表面仕上げ度など、物体表面の特性に関する情報を提供します。
点群データの特徴
- 疎性
点群データは通常疎であり、連続した表面やボクセルメッシュとは異なり、表面や関心領域にのみ点が存在します。
- 無秩序性
点群内の点には固定された順序がなく、処理アルゴリズムは入力点の順序に依存しない必要があります。
- 不規則性
点群データの分布は不規則であり、画像におけるピクセルやボクセルのような固定グリッド構造を持ちません。
点群処理の一般的な課題
- 高次元性
点群データは通常高次元であり、処理が複雑です。
- ノイズと不完全性
取得した点群にはノイズが含まれていたり、一部が欠落している場合があり、前処理と修復が必要です。
- 計算効率
点群の疎さと無秩序な特性により効率的な処理が困難であり、専用に設計されたアルゴリズムとデータ構造が必要となります。
代表的な点群データフォーマット
点群の保存は一般的に以下のフォーマットが使われています。
LAS / LAZ
構造
LAS(.las)はAmerican Society for Photogrammetry & Remote Sensing(ASPRS)によるオープンなバイナリ形式です。ファイル構成としては、基本的に以下のセクションがあります。
- パブリックヘッダブロック(Public Header Block)
フォーマットバージョン、点数、範囲、スケーリング/オフセット、座標参照系に関する情報など。
- 可変長レコード(VLR、Variable Length Records)
ヘッダ後に続く任意/追加メタデータ
- 点データレコード(Point Data Records)
各点の座標(整数スケーリング方式)、強度、分類、スキャン角度、リターン数など。
保存されている情報
各点のX, Y, Z座標(通常はスケーリング+オフセットを用いた整数格納)
点の強度(intensity)、反射率(返波強度)
点の分類(classification):地表、建物、植生、その他物体など用途別分類
スキャンにおけるリターン番号/リターン総数:レーザーが複数回反射して戻る場合の識別情報
スキャン角度・方向・スキャナーIDなど、取得条件に関する属性
可変長レコードを通じた座標参照系(SRS/CRS)情報やメタデータ
読み込み・書き込み時に使われるPythonライブラリ例
E57
構造
E57(.e57)はASTM International標準による、スキャナ点群+付随データを交換可能なベンダ中立的ファイル形式です。内部構造としては以下のような特徴があります。
ヘッダ(48バイト)にファイルサイン、バージョン、XMLオフセット/長さ、ページサイズなどが含まれます。
データは「ページ」単位で分かれて、バイナリ点群ブロックや画像ブロック、XMLメタデータ部が含まれます。
XML形式でメタデータ階層(装置情報、スキャン位置/軌跡、座標系、センサーパラメータ)が記述され、それ以外に圧縮バイナリデータ部(点群、画像)があります。
保存されている情報
各点のX, Y, Z座標(多くは浮動小数点)
点の強度、反射率や色(R,G,B)の情報
スキャン時のスキャナー位置/姿勢(静止型)またはセンサー軌跡/タイムスタンプ(モバイルスキャン)
2Dパノラマ/イメージデータ(カメラ画像)と点群の関連付け(撮影画像+投影)
座標系(CRS)情報、センサー仕様・スキャン条件、取得日時、スキャン設定のメタデータ
組織化点群(organized point clouds)や未組織点群(unorganized)
読み込み・書き込み時に使われるPythonライブラリ例
PLY
構造
PLY(.ply)はスタンフォード大学で3Dスキャナ・モデル用に開発されたフォーマット(Polygon File Format)です。ヘッダ部はASCIIテキストで、データ部はASCIIまたはバイナリ形式。ヘッダ部で“element vertex N”と定義し、各頂点(点)に対して“property float x”, “property float y”, “property float z”などと続き、そこに色、ノーマル、テクスチャ座標、信頼度など任意のプロパティを定義できます。
保存されている情報
各点のX, Y, Z座標(浮動小数点が一般的)
任意で色(R,G,B)、透明度(A)、法線ベクトル(nx,ny,nz)、信頼度(confidence)、テクスチャ座標(s,t)等の属性。
頂点だけでなくメッシュ(面)やエッジ等も含められる仕様で、点群用途では面なし(頂点のみ)構成で使われます。
読み込み・書き込み時に使われるPythonライブラリ例
PCD
構造
PCD(.pcd)は点群処理ライブラリPoint Cloud Library(PCL)において標準的に用いられるフォーマットです。ヘッダ部はASCIIテキストで、データ部はASCIIまたはバイナリ形式。ヘッダには“VERSION”, “FIELDS”, “SIZE”, “TYPE”, “COUNT”, “WIDTH”, “HEIGHT”, “VIEWPOINT”, “POINTS”, “DATA”の情報が含まれます。
保存されている情報
基本的には各点のX, Y, Z座標
任意項目として“rgb”などを定義すれば色情報も保存可能です。
HEADER内のVIEWPOINT項目でセンサーの位置・向き(座標・四元数)
データを“organized”(画像のように幅×高さ)として格納することもでき、カメラ深度画像から変換された点群などで利用されます。
読み込み・書き込み時に使われるPythonライブラリ例
次回の点群についての記事では、ノイズ除去など点群に関する処理方法について紹介する予定です。点群技術や弊社製品にご興味がありましたら、お問い合わせよりお気軽にご連絡ください。