我们做点云重建,很多情况下激光扫描仪回传的点云数据是保存为.txt或者.dat的,而并非PCL所支持的PCD格式,这个时候就需要我们自行写代码进行读取

.dat文件读取

我们的点云数据文件如下所示,为二进制.dat文件,其中每一行是二维扫描仪线扫的数据,这么多行是因为云台转动得到的三维扫描数据。其中每一行的前52个字节是一些校验码等无效数据,我们需要自己写代码进行读取。

C++读取.dat文件没什么难度,重点是有个技巧需要知道,就是这个数据每4个字节是一个int型数据代表了点距离扫描仪的距离,因此我读取的时候必须每次读取4字节的16进制数存入一个int型变量。采用的方法如下:

int dst_temp;
for (int m = 0; m < 4; m++)
{char *p = (char *)&dst_temp;dataFile.read(p + 3 - m, sizeof(char));
}

思路就是,对一个int变量进行取址,将其地址强制转成char*,那么,这个指针char* p指向的就是int的首地址,我们每次读取一位,读四次刚好存满这个int。由于int存储的时候是先低位后高位,因此我们需要将先读的放到后面,后读的放到前面。上程序就是完成这个读取。
完整代码如下:

#include <pcl/visualization/cloud_viewer.h>
#include <iostream>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>
#include <fstream>
#include <queue>
#include <sstream>
#include <stack>
#include <string>
#include <math.h>using namespace std;
int user_data;int main()
{ifstream dataFile;pcl::PointCloud<pcl::PointXYZ>::Ptr pointcloud(new pcl::PointCloud<pcl::PointXYZ>);pcl::PointXYZ point_temp;       //上一点pcl::PointXYZ point_3D;         //当前点int dstOri, plsOri;             //原始距离值和反射率double pls, dst;                //处理后距离值和反射率dataFile.open("201715172734.dat",ios::binary); //以二进制形式打开文件if (dataFile){for (int i = 0; i < 600; i++)        //600行数据{ dataFile.seekg(52 + i * 8056);   //不读无效数据for (int j = 0; j < 1000; j++)   //每行1000个点{int dst_temp = 0;            //距离int pls_temp=0;              //反射率float theta, alpha;          //坐标变换的角度for (int m = 0; m < 4; m++)       //读取距离{char *p = (char *)&dst_temp;dataFile.read(p + 3 - m, sizeof(char));}for (int m = 0; m < 4; m++)       //读取反射率{char *p = (char *)&pls_temp;dataFile.read(p + 3 - m, sizeof(char));}dstOri = dst_temp;plsOri = pls_temp;if (dstOri == -2147483648 || dstOri == 2147483647)point_3D = point_temp;else{dst = dstOri / 10000.0;      //进行坐标变换theta = (500 * M_PI - j*M_PI) / 1998;alpha = -0.3 + i*0.001;point_3D.x = dst*sin(theta);point_3D.y = dst*cos(theta)*sin(alpha);point_3D.z = -dst*cos(theta)*cos(alpha);}point_temp = point_3D;pointcloud->push_back(point_3D);//将点存入pointcloud}}cout << pointcloud->size() << endl;pcl::visualization::CloudViewer viewer("Cloud Viewer");//点云可视化//blocks until the cloud is actually renderedviewer.showCloud(pointcloud);while (!viewer.wasStopped()){//you can also do cool processing here//FIXME: Note that this is running in a separate thread from viewerPsycho//and you should guard against race conditions yourself...user_data++;}}else{cout << "No datafile";}dataFile.close();return 0;
}

效果如下:
重建效果:

.dat文件三维点云可视化相关推荐

  1. ROS kinetic环境使用Realsense D435i获取三维点云并存为.pcd文件

    ROS kinetic环境使用Realsense D435i获取三维点云并存为.pcd文件 二进制安装D435的SDK 下载intel Realsense ROS工作空间 ROS下驱动D435i获得点 ...

  2. python读取dat数据_dat文件读写_c语言读写dat文件_c语言读dat文件 - 云+社区 - 腾讯云...

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 13 }文件读写:写入目录的获取比较麻烦,各个平台不同,所以用c++自己的文件读 ...

  3. 三维点云学习(6)7-3D Object Detection-KITTI object detection evaluation(2)-kitt 数据集文件分卷解压方式

    三维点云学习(6)7-3D Object Detection-KITTI object detection evaluation(2)-kitt 数据集文件分卷解压(踩坑) ps:花了两天时间,疯狂下 ...

  4. 使用MATLAB来可视化三维点云上的法向量

    下面展示一种在三维点云上可视化法向量的方法,将单位向量映射到RGB立方体上相应的RGB颜色.用于将三维点云或网格数据上的法向矢量可视化为彩色,而不是法向量箭头因为有时很难看清楚箭头的指向. 对于点云中 ...

  5. 【三维语义分割】三维点云语义分割可视化

    本文为博主原创文章,未经博主允许不得转载. 本文为专栏<python三维点云从基础到深度学习>系列文章,地址为"https://blog.csdn.net/suiyingy/ar ...

  6. 点云文件的.dat文件读取保存

    c++存取dat数据_破晓前的彷徨的博客-CSDN博客_c语言数据存储到dat文件 二进制binary和Ascii ASCII 模式和 Binary 模式的区别是换行符的处理,Binary 模式不对数 ...

  7. 基于三维点云数据的主成分分析方法(PCA)的python实现

    主成分分析(PCA)获取三维点云的坐标轴方向和点云法向量 # 实现PCA分析和法向量计算,并加载数据集中的文件进行验证import open3d as o3d # import os import n ...

  8. creator qt 设置换行方式_win下使用QT添加VTK插件实现点云可视化GUI

    大家在做点云的时候经常会用到QT,但是我们需要使用QT做点云的可视化的时候又需要VTK,虽然我们在windows下安装PCL的时候就已经安装了VTK,由于跟着PCL安装的VTK是没有和QT联合编译的, ...

  9. abaqus dat文件 matlab_提升Abaqus求解效率的七种武器

    作者简介 作者:江丙云 本文首发于iCAETube公众号,技术邻CAE学院授权转载. 江丙云,上海交通大学博士,CAEMC-国际注册CAE工程管理咨询工程师,<汽车实用技术>编委会副秘书长 ...

  10. D3临摹作业_分词与词云可视化(西安交大国家艺术基金数据可视化培训第28天)

    第十二章  分词与词云可视化 第一节 词云图 概念:一种富文本信息可视化技术,通过布局算法用文字大小表示词频,辅以多种颜色,直观的反映词组重要性差异,展示文本关键摘要信息.完整的词云分析包括:分词.词 ...

最新文章

  1. 特斯拉AI主管给你的33条深度学习训练建议
  2. Activiti操作数据库中文乱码
  3. Thymeleaf模板引擎---SpringBoot
  4. 前端学习(2247)为什么用git-new
  5. django-模型类操作-初期阶段-小结
  6. Java项目案例大全
  7. RabbitMQ详解(一)
  8. 从零开始学前端:CSS背景颜色 --- 今天你学习了吗?(CSS:Day09)
  9. java 验证码_如何用java实现验证码?
  10. 多元线性模型的分位数回归
  11. win7与internet时间同步出错_时间同步出错,教您时间同步出错
  12. 问卷星中问卷设计的一些设置----笔记
  13. 五层木桶理论/五层木桶理论
  14. codeforce Zebras(思维 + 模拟)
  15. 电子邮件群发最好用的邮箱是哪个?
  16. Worthington毒液中核酸外切酶的特征及相关文献
  17. HTML入门零基础教程(四)
  18. 简单三步轻松恢复Mac电脑丢失的文件
  19. 关于网站推广 网站营销 建议
  20. 谷歌浏览器webGL实验

热门文章

  1. 一篇文章学会Yaml的语法超详细(建议收藏)
  2. 话费充值哪里便宜?这样充帮我省了不少钱,推荐给您
  3. 西门子PLC 1200和V20变频器USS通讯
  4. Au 音频效果参考:调制
  5. 如何使用XShell将本机文件上传到虚拟机上?
  6. python鼠标点击脚本_python模拟鼠标点击脚本
  7. VastBase技术实践
  8. python如何识别图片中的文字_如何利用Python识别图片中的文字
  9. 基于一维卷积神经网络模型的AI量化智能选股策略
  10. oracle年龄计算函数