C++
OpenCV
VisualStudio
Kinect
3D

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は、相当メモリを食うので気を付ける。