林です。Point Cloud Libraryの全体像の紹介記事の2回目です。
- Point Cloud Library について その①「PCLの登場の経緯」
- Point Cloud Library について その②「PCLの概要」
- Point Cloud Library について その③「PCLでの点群データの取り扱い」
この記事(②)ではPoint Cloud Libraryの概要として「どのような機能が搭載されていて、それらを用いてどういったことが実現できるか」について紹介します。
■Point Cloud Libraryの概要
Point Cloud Libraryは、(OpenCVと同じように)数々の処理モジュールから構成されている、C++言語による大規模点群処理ライブラリです。ロボットビジョン(ロボットが自立的に作業するための眼として使うアプリケーション)、および(ロボットではないが、デプスセンサーと計算機で点群を処理する)3Dコンピュータビジョンや、その他3D処理目的に使用できる
3D点群処理が数多く格納されたライブラリです。リアルタイム処理性(計算スピード)と、マルチプラットフォーム対応を目的として、C++言語が採用されており、Windows, Mac OSX, LinuxのそれぞれのOSにおいて、C++言語によってPCLに用意されている数多くのクラスを使用することができます。
以下のPCLの公式サイトの「about(英語)」に、概要が説明されています。
Point Cloud Libaryついての説明(about)
このaboutの真ん中程にも書かれているように、PCLはトヨタ社やTrimble社など、3D点群を測量やマシンビジョンで活用している会社を中心に、多くの企業から支援を受けながら開発されています。
PCLのライセンスは「3-clause BSD license」 であり、商用にも研究用にも無料で使用できます。また、安価なKinect/Intel RealSenseなどのデプスセンサーだけでなく、高価な商用のLIDARセンサー等とも連携しており(※ PCLの点群データ形式でこれらのセンサーから簡単にデータを取得可能)、建築、医療、自動車、などの少し効果な起業向けの点群処理用途にも全て対応しています。
2014年9月末現在、PCL1.7.2が最新版であるPCLでは、モジュールごとに点群処理に必要な様々な処理が網羅的に収録されています。中心となるモジュール群で網羅されている点群処理に必要な基本機能、「点群の入出力処理」「フィルタリング」「レジストレーション(位置合わせ)」「近傍探索」「キーポイントと特徴量の計算」「点群の3D可視化」などに加えて、ここ最近では「物体認識」「人物追跡と人物姿勢推定」「トラッキング(物体追跡)」などの発展的な機能もオプションモジュールとして追加されてきています(以下のaboutページから引用の画像が、モジュール間の関係性を表示)。
■Point Cloud Libraryを用いた、単純なアプリケーション例
以下の動画は、Kinectからリアルタイムに取得した点群を、PCLのVisualizationモデルに搭載されているCloud Viewerで表示しているデモ動画です
Point Cloud LibraryではKinectなどのデプスセンサーから取得したデータを、次回紹介を行うPCL専用の点群データ構造であるPointCloudオブジェクトとして変換された状態で取得し、この動画のようにそれを(簡単に)3D可視化することが可能です。Primisense社のセンサーの場合は、「OpenNIGrabber」というPCLのクラスで、デプスセンサーからのRGBD点群のリアルタイム取得が可能です。
■デプスセンサーのSDKとの比較:PCLは基本的な点群処理が全部入り
PCLは既に説明したように「主な点群処理」が広く網羅的に収録されたライブラリです。この記事の読者には、PCLは使用してはいないものの、Kinect SDKやOpenNI 2などのライブラリは既に使用されているエンジニアの方も多いと思います。そこで、それらのライブラリとPCLの違いを、整理しておきたいと思います。
例えばKinect for Windows SDKでは、3D投影はされていない距離画像の状態で毎フレームの3Dデータが取得されますが、先程のKinectからのリアルタイム点群取得の動画の例では、PCLのクラス(OpenNIGrabber)が、「距離画像+RGB画像からのPointCloudへの変換処理」をブラックボックス化し、担当してくれています。
すなわちPCLを用いれば、Kinectから毎フレームのデータは既に3D点群に変換された状態で取得できるので、その毎フレームの点群データを用いた点群処理にのみ集中することが可能です。ここには、「点群取得以降の点群処理が主目的であり、それ以外の煩わしさをなるべく除いておきたい」という、PCLの設計志向を感じることができます。事実、最新のPCL1.7.2では、Intel社のReal Senseデプスセンサーや、自律走行車などの研究で使われているVelodyne社のセンサーなどからも、リアルタイムに毎フレームのPCL形式の点群を簡単に取得することができます。(参考:Velodyne社のセンサーから点群取得ができる、
HDL Grabberクラスのチュートリアル)。また、PCL専用の点群データ形式である.pcd形式での入出力に加え、例えば旧来から使われている「.ply形式」での保存もPCLではできるので、点群を処理したあと.ply形式で保存して、点群処理・メッシュ処理のアプリケーションからその点群を読み込んで編集・加工することも可能です(例:
先日PCCでも紹介したMeshlabなど)。
また、例えば、先程のデプスセンサーからの点群取得・可視化のプログラムに、毎フレームで取得した点群をフィルタリングで処理するといったことも、既にPCLに用意されているクラスを用いると、たった数行のコードの追加のみで実現できます(例:バイラテラルフィルタでノイズ除去をしながら滑らかな点群にする)。
点群ファイルを1つ(もしくは複数)読み込み、それ(ら)に対して、レジストレーション、セグメンテーション、特徴点の計算とマッチングなどを行う際も同様で、それぞれ「registarion」「segmentation」「features」などのPCLの各モジュールに、多くの基本的な点群処理が用意されているので、それらを用いて(良い意味で誰でも)点群処理プログラムを作成することが可能となっています。(※ もちろん、OpenNIなどと同時にPCLを使用すれば、リアルタイムで取得する人間のポーズ情報と、点群処理を組み合わせたアプリケーションを作成することも可能です)。
以上のように、Kinect SDKなどが「モーションキャプチャ」や「ナチュラルインターフェース」が主な目的であるのに対して、PCLの目的は「3D点群や距離画像そのものに対する処理」が、幅広く収録されており、点群自体を処理・解析することが目的であることが、今後の記事を通してもわかっていただければ幸いです。
ここまでKinectを入力センサーを用いた話ばかり例示していたので、勘違いを防ぐために最後に強調していましたが、PCLは
汎用的な点群データ全てを入力とできるライブラリです。専用データ形式以外の.pcdデータ以外の3Dデータでも、内容を読み込んで、PCLのPointCloud<PointT>にさえ格納してしまえば、後は豊富なPCLの点群処理クラスを全て活用できるからです。従って、この記事の序盤にも話した、「昔から存在するレーザー測量などによる高価で高精度な3Dスキャナー」を用いて取得した点群データも、Point Cloud Libraryで処理することは当然ながら可能です。更に言うと、CG的に生成したデータでも、Point Cloud Libraryのデータ形式に変換すれば処理することが当然ながら可能です。別途、そういった記事も書くかもしれませんが、3Dプリンターで出力するための綺麗な穴がないデータに加工するようなアプリケーションも、Point Cloud Libraryを用いれば作ることも可能です。
以上のように、Kinect SDKなどはデプスセンサーの生データ取得とモーションキャプチャデータへのアクセスが主な機能であるのに対して、PCLは点群データの処理が広く全部入っている大規模ライブラリです。
■まとめ
以上、今回の前編では「PCLの概要」について紹介しました。あらゆる点群データ全てに対して使用可能であるPoint Cloud Libraryは、ライブラリの規模も大きくてすぐには使いこなせないかもしれませんが、3D点群を活用する皆様の武器になると思います。ぜひ注目しててみてください(次回の③に続きます)。
林 昌希