点群データの基礎と 3D 再構成 - 取得から処理・可視化まで
点群データとは - 3D 空間の離散的表現
点群 (Point Cloud) は、3D 空間内の点の集合として物体やシーンの形状を表現するデータ形式です。各点は最低限 (x, y, z) の 3D 座標を持ち、追加属性として色 (RGB)、法線ベクトル、反射強度、セマンティックラベルなどを含むことができます。
点群データの特徴:
- 非構造的: 画像のようなグリッド構造を持たず、点の順序に意味がない
- 疎密が不均一: センサーからの距離や角度によって点の密度が変化する
- ノイズを含む: センサーの測定誤差により、真の表面から外れた点が存在する
- 大規模: 1 スキャンで数百万から数十億点のデータが生成される
点群の用途:
- 自動運転: LiDAR で周囲環境を 3D 認識し、障害物検出・経路計画を行う
- 建設・測量: 地形や建物の 3D 計測、BIM (Building Information Modeling) との連携
- 文化財保存: 遺跡や彫刻のデジタルアーカイブ
- 製造業: 部品の寸法検査、リバースエンジニアリング
データ形式: PLY (Polygon File Format) が最も汎用的で、ASCII とバイナリの両形式をサポートします。LAS/LAZ は航空測量の標準形式で圧縮効率が高く、PCD は PCL (Point Cloud Library) の独自形式です。E57 は 3D スキャナーの業界標準で、メタデータの記録に優れています。1 億点の点群は PLY バイナリで約 2.4GB、LAZ 圧縮で約 400MB になります。
点群の取得方法 - LiDAR、深度カメラ、SfM
点群データを取得する主要な 3 つの方法を解説します。それぞれ精度、範囲、コスト、用途が異なるため、目的に応じた選択が重要です。
LiDAR (Light Detection and Ranging): レーザー光を照射し、反射光の往復時間 (ToF) から距離を計測します。最も高精度な 3D 計測手段です。
- 地上型 (TLS): Leica RTC360 など。精度 ±1mm、範囲 130m、毎秒 200 万点。1 台 500-1500 万円
- 航空型 (ALS): ドローンや航空機搭載。精度 ±3cm、広域計測に最適
- 車載型 (MLS): Velodyne VLP-16 など。自動運転用。毎秒 30 万点、360° 計測
- iPhone LiDAR: iPad Pro / iPhone Pro 搭載。精度 ±1cm、範囲 5m。手軽な 3D スキャン
深度カメラ (RGB-D): 色画像と深度画像を同時に取得するカメラです。
- Intel RealSense D435: ステレオ IR 方式。精度 ±2%@2m。屋内向け
- Microsoft Azure Kinect: ToF 方式。精度 ±11mm@1m。ボディトラッキングに最適
- 構造化光: パターン投影で高精度な形状計測。産業用 3D スキャナーに採用
Structure from Motion (SfM): 複数視点の 2D 画像から 3D 点群を復元する手法です。特別なセンサーが不要で、通常のカメラやスマートフォンで利用可能です。COLMAP が代表的なオープンソース実装で、特徴点検出 → マッチング → バンドル調整 → 密な再構成のパイプラインを提供します。100 枚の画像から数百万点の点群を生成でき、精度は撮影条件に依存しますが ±1-5cm 程度です。
点群の前処理 - ノイズ除去とダウンサンプリング
取得した生の点群データには、センサーノイズ、外れ値、不均一な密度などの問題があります。後続の処理 (メッシュ化、特徴抽出、認識) の精度を確保するため、適切な前処理が不可欠です。
統計的外れ値除去 (SOR): 各点の k 近傍点までの平均距離を計算し、全点の平均距離 + n×標準偏差を超える点を外れ値として除去します。Open3D では pcd.remove_statistical_outlier(nb_neighbors=20, std_ratio=2.0) で実行可能です。k=20、n=2.0 が一般的な設定で、点群の 1-5% が除去されます。
半径外れ値除去 (ROR): 各点の半径 r 内の近傍点数が閾値未満の点を除去します。孤立した点を効果的に除去できます。pcd.remove_radius_outlier(nb_points=16, radius=0.05) で、半径 5cm 内に 16 点未満の点を除去します。
ボクセルダウンサンプリング: 3D 空間をボクセル (立方体グリッド) に分割し、各ボクセル内の点を 1 点 (重心) に集約します。点群の密度を均一化し、データ量を削減します。
pcd.voxel_down_sample(voxel_size=0.01)で 1cm ボクセルにダウンサンプリング- ボクセルサイズの選択: 屋内シーン 0.5-2cm、屋外シーン 5-20cm、都市規模 50cm-1m
- 1 億点 → 1cm ボクセルで約 500 万点に削減 (95% 削減)
法線推定: 各点の局所的な表面法線を推定します。メッシュ再構成やポイントベースレンダリングに必須です。pcd.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.1, max_nn=30)) で、半径 10cm 内の最大 30 点から法線を推定します。法線の向きの一貫性は pcd.orient_normals_consistent_tangent_plane(k=15) で確保します。
点群レジストレーション - 複数スキャンの統合
大きなシーンを 3D 計測する場合、1 回のスキャンでは全体をカバーできないため、複数の視点からスキャンした点群を共通座標系に統合する必要があります。この処理をレジストレーション (Registration) または位置合わせと呼びます。
ICP (Iterative Closest Point): 最も基本的なレジストレーション手法で、2 つの点群間の最近傍点ペアを反復的に更新しながら、変換行列 (回転 + 並進) を最適化します。
- Point-to-Point ICP: 対応点間のユークリッド距離を最小化。収束が遅い
- Point-to-Plane ICP: 点から対応点の接平面への距離を最小化。収束が 5-10 倍高速
- Open3D:
o3d.pipelines.registration.registration_icp(source, target, max_distance, init_transform, estimation_method)
初期位置合わせの重要性: ICP は局所最適化手法のため、初期位置が真の解から大きく離れていると収束しません。初期位置合わせには以下の手法を使用します。
- FPFH + RANSAC: Fast Point Feature Histograms で局所特徴量を計算し、RANSAC で対応点を推定。Open3D の
registration_ransac_based_on_feature_matching()で実装 - 手動指定: 3 点以上の対応点を手動で指定し、初期変換を計算
グローバルレジストレーション: 多数のスキャンを同時に最適化するマルチビューレジストレーションでは、ポーズグラフ最適化を使用します。各スキャンペアの相対変換をエッジとするグラフを構築し、全体の整合性を最大化する変換を求めます。Open3D の multiway_registration() で利用可能です。100 スキャンの統合で累積誤差を 1cm 以下に抑えることが可能です。
メッシュ再構成 - 点群から表面モデルへ
点群は離散的な点の集合であり、連続的な表面を直接表現しません。3D プリント、CAD、レンダリングなどの用途では、点群から三角形メッシュ (表面モデル) を再構成する必要があります。
Poisson Surface Reconstruction: 点群の法線情報を利用して、暗黙的な表面関数を推定し、等値面としてメッシュを抽出します。滑らかで水密な (穴のない) メッシュを生成できる利点があります。
- Open3D:
o3d.geometry.TriangleMesh.create_from_point_cloud_poisson(pcd, depth=9) - depth パラメータ: 8-12 の範囲。大きいほど詳細だが計算コスト増加。depth=9 で 100 万点を約 10 秒で処理
- 欠点: データが存在しない領域にも表面を生成してしまう (過度な補間)
Ball Pivoting Algorithm (BPA): 仮想的な球を点群上で転がし、球が 3 点に同時に接する三角形を生成します。データに忠実なメッシュを生成しますが、点群の密度が不均一だと穴が生じます。
- Open3D:
o3d.geometry.TriangleMesh.create_from_point_cloud_ball_pivoting(pcd, radii) - 球の半径は点群の平均点間距離の 1-3 倍に設定する
Alpha Shapes: Delaunay 三角形分割から、α パラメータで制御される形状を抽出します。凹形状にも対応でき、パラメータ調整で詳細度を制御可能です。
深層学習による再構成: NeRF (Neural Radiance Fields) や 3D Gaussian Splatting は、画像群から暗黙的な 3D 表現を学習し、任意視点のレンダリングを可能にします。従来のメッシュ再構成とは異なるアプローチですが、フォトリアリスティックな 3D 再構成を実現します。3D Gaussian Splatting は 100 枚の画像から約 30 分の学習で、リアルタイムレンダリング可能な 3D シーンを生成します。
点群処理の実践 - ツールとパイプライン構築
点群処理を実務で活用するための具体的なツール選定、処理パイプラインの構築方法、パフォーマンス最適化のテクニックを解説します。
主要ライブラリ:
- Open3D: Python/C++ の点群処理ライブラリ。可視化、前処理、レジストレーション、メッシュ化を統合的に提供。学術・プロトタイプ向け
- PCL (Point Cloud Library): C++ の高性能ライブラリ。産業用途の標準。ROS との連携が強力
- CloudCompare: GUI ベースの点群処理ソフト。大規模点群の可視化と手動編集に最適。無料
- PDAL: 地理空間点群のパイプライン処理。LAS/LAZ の読み書きに特化
処理パイプラインの例 (建物の 3D モデル化):
- LiDAR スキャン (複数視点) → 点群取得
- SOR + ボクセルダウンサンプリング → 前処理
- FPFH + ICP → レジストレーション (複数スキャン統合)
- 法線推定 → Poisson 再構成 → メッシュ生成
- テクスチャマッピング → 最終モデル
大規模点群の処理戦略: 10 億点以上の点群はメモリに収まらないため、空間分割 (Octree) で管理し、必要な領域のみをロードする Out-of-Core 処理が必要です。Potree は Web ブラウザで数十億点の点群をストリーミング表示できるオープンソースツールです。
GPU 加速: CUDA ベースの点群処理ライブラリ (cuPCL、kaolin) を使用すると、ICP やボクセル化が CPU の 10-50 倍高速になります。1 億点の ICP が CPU で 30 秒かかる処理が、GPU で 1 秒以下に短縮されます。