이진 형식의 pcd 형식의 파일을 출력합니다
pcd 형식:
http://pointclouds.org/documentation/tutorials/pcd_file_format.php
이걸 봤는데 간단한 형식이라 PCL 없이 pcd를 출력할 수 있어요.그러나 ASCII 형식이면 읽기가 느리기 때문에 이진 형식으로 출력된다.그럼에도 불구하고 헤드와 ASCII는 형식이 같고 데이터 부분에서 2진법으로 바뀐다.
다음은 pcd 파일로 출력할 수 있는 적당한 제작점 코드입니다.
c++-main.cpp
#include <stdio.h>
#include <vector>
struct pt_t {
float x, y, z;
pt_t() { ; }
pt_t(float _x, float _y, float _z) {
x = _x;
y = _y;
z = _z;
}
};
#define RGB(r, g, b) ((int(r) << 16) + (int(g) << 8) + int(b) )
void main(){
//***********************************************************
// 適当な点群リストを作成
std::vector<pt_t> pts;
pt_t pt(7,23,35);
float s = 10, b = 1.8, r = 20, dt = 0.0001;
for (int i = 0; i < 500000; i++) {
pt = pt_t(
pt.x - dt * s*(pt.x - pt.y),
pt.y + dt*(-pt.x*pt.z + r*pt.x - pt.y),
pt.z + dt*(pt.x*pt.y - b*pt.z)
);
pts.push_back(pt);
}
//***********************************************************
// pcdファイル(バイナリ形式)に出力
FILE *fp = fopen("test.pcd", "wb");
// ヘッダ
fprintf(fp, "# .PCD v.7 - Point Cloud Data file format\n");
fprintf(fp, "VERSION .7\nFIELDS x y z rgb\nSIZE 4 4 4 4\nTYPE F F F U\nCOUNT 1 1 1 1\n");
fprintf(fp, "WIDTH %d\nHEIGHT 1\nVIEWPOINT 0 0 0 1 0 0 0\nPOINTS %d\nDATA binary\n", pts.size(), pts.size());
// 中身をバイナリで書き込み
for (int i = 0; i < pts.size(); i++) {
// 適当に色を付ける
unsigned int col = RGB(pts[i].z * 5, 128 + 3*pts[i].x, 128 + 3 * pts[i].y);
float xyz[3] = { pts[i].x, pts[i].y, pts[i].z};
fwrite( xyz, sizeof(float), 3, fp);
fwrite(&col, sizeof(unsigned int), 1, fp);
}
fclose(fp);
}
50000점이 있는데 동작이 바삭바삭해요.
점 그룹의 커브 표현식은 다음을 참조합니다.
https://sites.google.com/site/cinderellajapan/shindererarekucha-1/ka-osu
Reference
이 문제에 관하여(이진 형식의 pcd 형식의 파일을 출력합니다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/gou_koutaki/items/3c430db5e99e8771ed94텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)