PLYとは
.plyファイルは3次元点群を格納するためのファイル形式で、MeshLab等で開いて、3次元点群の表示&編集ができる。
色付きの3次元点群の保存
色付きの3次元点を保存するPoint3dRGB構造体の宣言
struct Point3dRGB{
cv::Point3d point;
uchar r;
uchar g;
uchar b;
};
pCloud.push_back(point3dRGB)を用いて、3次元点群の位置(x,y,z)とその色(r,g,b)が格納されているとする
Point3dRGB point3dRGB;
std::vector<Point3dRGB> pCloud;
point3dRGB.point.x = 0.0; //double型で単位はm、mmでもいい
point3dRGB.point.y = 0.0;
point3dRGB.point.z = 0.0;
point3dRGB.r = 0; //赤:0~255
point3dRGB.g = 0; //緑:0~255
point3dRGB.b = 0; //青:0~255
pCloud.push_back(point3dRGB);
ファイルに保存する
//イテレータの設定
std::vector<Point3dRGB>::iterator begin;
std::vector<Point3dRGB>::iterator end;
begin = pCloud.begin();
end = pCloud.end();
//ファイル名の設定
int fileNum = 0;
char fileName[100];
sprintf_s(fileName, "pCloud%4d.ply", fileNum);
//ファイルオープン
FILE *fp;
fp = fopen(fileName, "w");
//ファイルに書き込む
//ヘッダの設定
fprintf(fp,
"ply\n format ascii 1.0\n comment Kinect v1 generated\n element vertex %d\n property double x\n property double y\n property double z\n property uchar red\n property uchar green\n property uchar blue\n end_header\n", begin->size());
//3次元点群
for (; begin != end; ++begin){
fprintf(fp, "%lf %lf %lf %u %u %u\n", begin->point.x, begin->point.y, begin->point.z, begin->r, begin->g, begin->b);
}
//ファイルクローズ
fclose(fp);
//ファイル名更新
fileNum++;
.plyのヘッダファイルが重要(メモ帳などで開いてみよう)
ply
format ascii 1.0
comment Kinect v1 generated
element vertex 点群の数
property double x
property double y
property double z
property uchar red
property uchar green
property uchar blue
end_header
以下、点群の列
x y z r g b
x y z r g b
x y z r g b
…
MeshLabで開くとこんな感じ。(freiburg1_xyzを使用)
色なしの3次元点群の保存
ヘッダファイルの設定とx,y,zの数値を並べればよい。
ply
format ascii 1.0
comment Kinect v1 generated
element vertex 点群の数
property double x
property double y
property double z
end_header
x y z
x y z
x y z
…
Normalの表示
Normal(法線ベクトル)の表示もできる。
以下に、ヘッダの設定を示す。
ply
format ascii 1.0
comment VCGLIB generated
element vertex 1769
property float x
property float y
property float z
property float nx
property float ny
property float nz
end_header
x y z nx ny nz
x y z nx ny nz
x y z nx ny nz
…
MeshLabのRender->Show Normal/Curvatureで表示できる
まとめ
- PLYファイルの作成(C/C++)とMeshLabによる表示
- ヘッダを間違うと読み込めないので注意!
- 点群の数は、Kinect v1でDepth画像から3次元点群を生成するとき、307200(640*480)をよく使う。
- 点群のpush_backは、相当メモリを食うので気を付ける。