PCD Writer for Kinect Fusion

What is PCD?

PCD(Point Cloud Data)はPoint Cloudデータを格納するためのフォーマットです。
主にPCLで利用することを想定しています。

What are the advantages over other file formats?

これまでもPoint Cloudデータをサポートするフォーマットはいくつもありました。
しかし、それらのフォーマットはPoint Cloudデータに最適化されたものではありませんでした。

チュートリアルで紹介されているPCDの主な利点は以下の通りです。

  • Support the Organized Point Cloud Data
  • Organized Point Cloudデータとは、ステレオカメラやToFカメラの出力するPoint Cloudデータを示します。
    データが画像のように行と列に分割された構造をしており、隣接する点を必要とする処理における近傍点へのアクセスが非常に容易です。

  • Flexible and Efficient to the Point Cloud Data
  • 様々なプリミティブ型の値を格納することができ、Point Cloudデータの読み書きが柔軟に効率よく行うことができます。

  • Best Adapt Data Format to PCL
  • PCLがネイティブでサポートしており、他のファイルフォーマットと違い内部での変換処理による遅延がありません。

  • Support N-dimension Histograms
  • 特徴記述子のためのN次元ヒストグラムをサポートしています。

PCD File Format

PCDファイルは以下のヘッダとデータで構成されています。
ヘッダは以下の情報を持っています。
(括弧内は例です。)

  • VERSION
  • PCDファイルフォーマットのバージョン番号(0.7)

  • FIELDS
  • データフィールドの要素ごとの形式(x y z rgb)

  • SIZE
  • データフィールドの要素ごとのサイズ(4 4 4 4)

  • TYPE
  • データフィールドの要素ごとの型(F F F I)

  • COUNT
  • データフィールドの要素ごとの数(1 1 1 1)

  • WIDTH
  • データの幅(Vertices Count)

  • HEIGHT
  • データの高さ(1)

  • VIEWPOINT
  • ビューポイント(0 0 0 1 0 0 0)

  • POINTS
  • データに含まれるPointの数(Vertices Count)

  • DATA
  • PCDファイルの形式(ascii or binary)

データは上記のヘッダの下に続けて1つの点に1行で記述されています。
(実際は”n”にデータ数、”x y z rgb”にそれぞれ座標と色が入ります。)

VERSION 0.7
FIELDS x y z rgb
SIZE 4 4 4 4
TYPE F F F I
COUNT 1 1 1 1
WIDTH n
HEIGHT 1
VIEWPOINT 0 0 0 1 0 0 0
POINTS n
DATA ascii
x y z rgb
x y z rgb
x y z rgb
   ...
x y z rgb

PCD Writer for Kinect Fusion

Kinect Fusionで再構成した三次元形状データは、KinectFusionHelperを使うことでPLYなどのファイルに書き出すことができます。
KinectFusionHelperでは、一般的なフォーマットへの書き出しのみ実装されています。

そこで、直接PCDファイルへ頂点データを書き出すPCD Writerを実装しました。
PCD Writerは以下で公開しています。

Basic Usage PCD Write

PCD Writerの基本的な使い方を紹介します。

Include

pcd_writer.hをインクルードします。

#include "pcd_writer.h"

Retrieve Mesh Data

Kinect FusionでMeshデータを取得します。

サンプリングステップは、出力するPoint Cloudデータのディティールとサイズに影響します。
小さいステップ値を設定すると細かいディティールを保持しますが、頂点数が多くなりファイルサイズも大きくなります。
大きいステップ値を設定すると頂点数が少なくなりファイルサイズも小さくなりますが、細かいディティールは保持できません。

頂点数が多いとファイルの読み書きに時間がかかります。
特にKinect Fusionのデータは非常に密で頂点数が多くなるので注意してください。

// Calculate Mesh Data
const UINT step = 1;
ComPtr<INuiFusionColorMesh> mesh;
ERROR_CHECK( reconstruction->CalculateMesh( step, &mesh ) );

Write PCD File

PCDファイルに頂点データを書き出します。
データを左右反転するかどうか、色情報を書き出すかどうかを指定できます。
書き出しが成功したかどうかは、戻り値のHRESULTで判定できます。

// Write PCD File ( ASCII )
const std::string filename = "../ascii_file.pcd";
HRESULT ret = WriteAsciiPcdFile( mesh.Get(), filename, true, true );
if( FAILED( ret ) ){
    return -1;
}

// Write PCD File ( Binary )
const std::string filename = "../binary_file.pcd";
HRESULT ret = WriteBinaryPcdFile( mesh.Get(), filename, true, true );
if( FAILED( ret ) ){
    return -1;
}

Verify PCD File

PCDファイルが正常に書き出せたかどうか、ビューワーソフトで確認してみましょう。
これらのソフトを利用することで、PCDファイルのデータを表示できます。

  • pcl_viewer
  • pcl_viewerはPCLに付属するアプリケーションです。
    All-in-one Installerを使ってPCLをインストールした場合、ライブラリと一緒にインストールされます。(<PCL_ROOT>\bin\pcl_viewer_release.exe)

  • CloudCompare
  • CloudCompareはPoint Cloudデータの表示・編集などの機能を備えたフリーソフトウェアです。

 


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です