点云库PCL学习——点云的格式、PCD文件的打开和显示

一、点云的格式

存储点云的文件有pcd   ply

pcd的文件头格式

# .PCD v0.7 - Point Cloud Data file format
VERSION 0.7       
FIELDS x y z
SIZE 4 4 4
TYPE F F F
COUNT 1 1 1
WIDTH 460400
HEIGHT 1
VIEWPOINT 0 0 0 1 0 0 0
POINTS 460400
DATA ascii

VERSION是指定版本号  |   FIELDS是指定每一个点所拥有的的维度名字    |   SIZE是每个维度占的字节大小   |  TYPE是每一个维度的类型

|   WIDTH –用点的数量表示点云数据集的宽度。根据是有序点云还是无序点云,WIDTH有两层解释:

1)它能确定无序数据集的点云中点的个数(和下面的POINTS一样);

2)它能确定有序点云数据集的宽度(一行中点的数目)。

|   HEIGHT –用点的数目表示点云数据集的高度。类似于WIDTH ,HEIGHT也有两层解释:

1)它表示有序点云数据集的高度(行的总数);

2)对于无序数据集它被设置成1(被用来检查一个数据集是有序还是无序)。

 VIEWPOINT是指定数据集中点云的获取视点。VIEWPOINT有可能在不同坐标系之间转换的时候应用,在辅助获取其他特征时也比较有用,例如曲面法线,

### 使用PCL库将双目图像转换为点云PCD文件显示 #### 准备工作 为了完成此任务,需安装配置好C++开发环境,并确保已成功安装OpenCVPCL库。此外,还需准备一组匹配良好的左视图与右视图作为输入。 #### 获取立体校准参数 在处理之前,必须先获取相机的内参矩阵以及两摄像头之间的相对位置关系(即外参)。这些信息通常通过预先执行过的立体标定过程获得[^3]。 #### 加载图像 利用OpenCV读取存储于磁盘上的两张图片: ```cpp cv::Mat imgLeft = cv::imread("path_to_left_image"); cv::Mat imgRight = cv::imread("path_to_right_image"); ``` #### 计算视差图 调用StereoBM或StereoSGBM类来计算左右图像间的像素差异,形成视差图: ```cpp cv::Ptr<cv::StereoBM> sbm = cv:: StereoBM::create(numDisparities, blockSize); sbm->compute(imgGrayL, imgGrayR, disparity); // 假设imgGrayL imgGrayR 是灰度版本 ``` 此处`numDisparities`代表最大可能存在的视差值数量;而`blockSize`则定义了用于比较的小窗口大小[^2]。 #### 构建三维坐标系下的点集合 借助上述所得视差图及事先求得的内外参,可以构建起对应的实际空间坐标的点集。这一步骤涉及到三角测量原理的应用,在PCL中有专门为此设计的功能接口——`reprojectImageTo3D()`: ```cpp cv::Mat Q; // 这里应该填入由stereoRectify()返回的结果之一 cv::reprojectImageTo3D(disparity, points_3d, Q); ``` 其中Q是一个四行五列的投影矩阵,它包含了重建所需的全部几何变换信息[^1]。 #### 创建Point Cloud Data (PCD) 文件 最后一步就是把上一步产生的浮点型三维数组转存至标准格式pcd文档当中去。这里给出一段简单的代码片段说明具体做法: ```cpp pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); for(int i=0;i<points_3d.rows;++i){ for(int j=0;j<points_3d.cols;++j){ float data[3]; memcpy(data, points_3d.ptr<float>(i)+j*3,sizeof(float)*3); if(!isnan(data[2])){ // 排除无效点 cloud->push_back(pcl::PointXYZ(data[0],data[1],data[2])); } } } // Save the container to a file. pcl::io::savePCDFileASCII ("test_pcd.pcd", *cloud); std::cerr << "Saved " << cloud->size () << " data points to test_pcd.pcd."<< std::endl; ``` 以上操作完成后即可得到保存有点云数据的目标文件[^4]。 #### 显示点云 要查看生成好的点云效果,可采用如下方式加载并渲染之: ```cpp #include <pcl/visualization/cloud_viewer.h> int main(){ ... pcl::visualization::CloudViewer viewer("Simple Cloud Viewer"); while (!viewer.wasStopped ()) { viewer.showCloud(cloud); } return 0; } ``` 这段程序会启动一个图形界面让用户直观感受最终成果。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值