Edited at

PLYファイルの作成方法(Visual Studio 2013, Kinect, C/C++, 3D点群処理)

More than 3 years have passed since last update.


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を使用)

point3drgb.png


色なしの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

開くとこんな感じ。

point3d.png


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で表示できる

normal.PNG


まとめ


  • PLYファイルの作成(C/C++)とMeshLabによる表示

  • ヘッダを間違うと読み込めないので注意!

  • 点群の数は、Kinect v1でDepth画像から3次元点群を生成するとき、307200(640*480)をよく使う。

  • 点群のpush_backは、相当メモリを食うので気を付ける。