当前位置: 首页 > article >正文

C++手写PCD文件

前言

一般pcd读写只需要调pcl库接口,直接用pcl的结构写就好了

这里是不依赖pcl库的写入方法
主要是开头写一个header
注意字段大小,类型不要写错

结构定义

写入点需要与header中定义一致
这里用的RoboSense的结构写demo
加了个1字节对齐

struct PointXYZIT {
  float x;
  float y;
  float z;
  uint16_t intensity;
  double timestamp;
} __attribute__((packed));

template <typename PointType>
class PointCloudT {
 public:
  typedef PointType PointT;
  typedef std::vector<PointT> VectorT;

  uint32_t height = 0;
  uint32_t width = 0;
  double timestamp = 0.0;
  uint32_t seq = 0;

  VectorT points;
};


代码实现

int record_pcd(PointCloudT<PointXYZIT> &point_cloud) {
  static int frame_id = 0;
  frame_id++;
  std::string pcd_file = "frame_" + std::to_string(frame_id) + ".pcd";
  int fd = open(pcd_file.c_str(), O_WRONLY | O_CREAT | O_TRUNC, 0644);
  const char *pcd_header =
        "# .PCD v.7 - Point Cloud Data file format\n"
        "FIELDS "
        "x y z intensity timestamp\n"
        "SIZE 4 4 4 2 8\n"
        "TYPE F F F U F\n"
        "COUNT 1 1 1 1 1\n"
        "WIDTH %zu\n"
        "HEIGHT 1\n"
        "VIEWPOINT 0 0 0 1 0 0 0\n"
        "POINTS %zu\n"
        "DATA binary\n";
  char header_buffer_[400];
  memset(header_buffer_, 0, sizeof(header_buffer_));
  uint64_t write_size =
      snprintf(header_buffer_, sizeof(header_buffer_), pcd_header, point_cloud.width, point_cloud.width);
  assert(write_size > 0 && write_size < sizeof(header_buffer_));
  int r = write(fd, header_buffer_, write_size);
  assert(r >= 0);
  for (int i = 0; i < point_cloud.width; i++) {
    r = write(fd, &point_cloud.points[i], sizeof(PointXYZIT));
    assert(r >= 0);
  }
  close(fd);
  fd = -1;
  return 0;
}


验证方法

可用pcl_viewer工具,打开写入的文件
或者用CloudCompare打开


http://www.kler.cn/a/403022.html

相关文章:

  • GPTZero:高效识别AI生成文本,保障学术诚信与内容原创性
  • SpringCloud SaToken整合微服务 集成Redis 网关路由权限拦截 服务间内部调用鉴权
  • vue 目录结构
  • 【ASE】第八课_冰(ice)的效果
  • java Queue 详解
  • 如何将文件Copy到Docker镜像中
  • 使用Kotlin写一个将字符串加密成short数组,然后可以解密还原成原始的字符串的功能
  • 前端页面自适应等比例缩放 Flexible+rem方案
  • 小程序-基于java+SpringBoot+Vue的超市购物系统设计与实现
  • 【React 进阶】掌握 React18 全部 Hooks
  • 鸿蒙原生应用开发元服务 元服务是什么?和App的关系?(保姆级步骤)
  • 详解八大排序(一)------(插入排序,选择排序,冒泡排序,希尔排序)
  • Linux驱动开发第2步_“物理内存”和“虚拟内存”的映射
  • EDA实验设计-led灯管动态显示;VHDL;Quartus编程
  • Ubuntu24.04LTS设置root用户可远程登录
  • Flutter踩坑记录(一)debug运行生成的项目,不能手动点击运行
  • Qt5-雷达项目
  • C++零基础入门:趣味学信息学奥赛从“Hello World”开始
  • 数字排序的多种方法与实现:从基础到优化
  • 【MyBatis 源码阅读与笔记】Mapper 接口的动态代理实现
  • Python实现随机分布式延迟PSO优化算法(RODDPSO)优化CNN分类模型项目实战
  • 2024.11|云计算行业的商业模式创新方法及实践
  • 【Python】selenium获取定位元素大小、电脑屏幕的像素、屏幕尺寸信息、以及网页尺寸的方法
  • Java EE 【知识改变命运】01计算机的一些知识点
  • 异常检测作业
  • ubuntu.24安装cuda