PLY 파일을 만드는 방법 (Visual Studio 2013, Kinect, C/C++, 3D 점 구름 처리)

PLY란?



.ply 파일은 3차원 점 구름을 저장하기 위한 파일 형식으로 MeshLab 등으로 열어 3차원 점 구름의 표시 & 편집을 할 수 있다.

컬러 3D 점군 저장



색된 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은 상당한 메모리를 먹기 때문에 조심한다.
  • 좋은 웹페이지 즐겨찾기