LoginSignup
26
26

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-02-03

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
26