PLY 파일을 만드는 방법 (Visual Studio 2013, Kinect, C/C++, 3D 점 구름 처리)
3523 단어 C++VisualStudioOpenCV3DKinect
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에서 표시 가능
요약
색된 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
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(법선 벡터)의 표시도 할 수 있다.
이하, 헤더의 설정을 나타낸다.
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에서 표시 가능
요약
Reference
이 문제에 관하여(PLY 파일을 만드는 방법 (Visual Studio 2013, Kinect, C/C++, 3D 점 구름 처리)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/SatoshiGachiFujimoto/items/d368ce499a549def1ba6텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)