困った
CloudCompare でPCD形式の点群ファイルを読み込んで可視化し確認していた時のこと。点群にはxyz座標・RGBチャネルに加えてクラスタを識別するカスタムフィールドlabel
(4byte unsigned int)が記録されている。PCDファイルはPCLライブラリを用いてpcl::PointXYZRGBL
型で出力したもの。
Property->Colors->Scalar field
と設定して、当然こんな感じで表示されるのを期待していたが…
実際に表示される画面は真っ青!label
の値が0に張り付いてる!?
環境
- PCL 1.9.1 x64
- CloudCompare v2.10.2 Stereo 64bit
原因
CloudCompare は符号なし整数型のカスタムフィールドをPCD形式で読んでくれない模様。試した限りで正しい値で読み出せたのは、
- 浮動小数型
- 符号あり整数型
加えて、CloudCompare で点群をPCD形式で出力すると、カスタムフィールドは浮動小数(4byte float)に強制的に変更される。現バージョンでは出力時に値の型を選択するなどのオプションも無い。
対処方法
一番簡単なのは、符号あり整数型として CloudCompare に読んでもらうこと。0 ~ 2^31-1
の範囲の値なら符号あり・なしでも32bitのビット列は同値なので、バイナリ型でもデータの中身を弄る必要はない。PCDファイルのヘッダを少し変更すればよい。label
に対する型TYPE
の情報をU -> Iに書き換える。
- Unsigned Int
- Int (signed)
# .PCD v0.7 - Point Cloud Data
file format
VERSION 0.7
FIELDS x y z rgba label
SIZE 4 4 4 4 4
- TYPE F F F U U
+ TYPE F F F U I
COUNT 1 1 1 1 1
WIDTH 1858475
HEIGHT 1
VIEWPOINT 0 0 0 1 0 0 0
POINTS 1858475
DATA binary
...binary data is written here...
毎回この作業をするのも面倒なのでsigned int
型のpcl::PointXYZRGBL
なんて代物を用意しておけば便利そうですね。