亲爱的观众朋友们大家好,这里是爱说标准c语言的老嫂子。。。
公司的项目终于快做完了,我又可以学自己的东西了( •̀ ω •́ )y~。今天把plc库下载并安装了,准备正式入门到放弃三维。
如何下载
进入官网下载界面:点击下载这两个,我下载了编译好的,当然也可以自己下载源码编译。
配置教程看这个博主的,非常详细。
下载好了之后,首先我就跟着上述教程,显示了一只点云兔子(兔子的数据要在网上下载,可以下载这位博主的)。
#define _CRT_SECURE_NO_WARNINGS
#include<pcl/visualization/cloud_viewer.h>
#include<iostream>
// PCL 的 IO 操作头文件,包含一些输入输出的基础函数和定义。
#include<pcl/io/io.h>
// PCL 的 PCD 文件 IO 操作头文件,包含读写 .pcd(Point Cloud Data)格式文件的函数。
#include<pcl/io/pcd_io.h>
// PCL 的 PLY 文件 IO 操作头文件,用于读取 .ply(Polygon File Format)文件。
#include<pcl/io/ply_io.h>
// PCL 的点类型定义头文件,提供了 PointXYZ、PointXYZRGB 等常用点类型的定义。
#include<pcl/point_types.h>
using namespace std;
using namespace pcl;
// 定义一个回调函数 viewerOneOff,它会在 PCLVisualizer 可视化器初始化时调用。viewer.setBackgroundColor(0, 0, 0); 将背景颜色设置为黑色。
void viewerOneOff(visualization::PCLVisualizer& viewer) {
viewer.setBackgroundColor(0, 0, 0); //设置背景颜色为黑色
}
int main() {
// 定义并初始化一个 PointCloud 对象指针 cloud,它是一个包含 PointXYZ 类型点的点云。PointXYZ 结构定义了一个 3D 点,每个点包含 x、y、z 坐标。
// ::Ptr 表示 PCL 中的智能指针,用于管理 PointCloud 对象的生命周期。
PointCloud<PointXYZ>::Ptr cloud(new PointCloud<PointXYZ>);
char strfilepath[256] = "rabbit.pcd";
// 调用 io::loadPCDFile 函数来加载指定路径的 .pcd 点云文件,将数据存入 cloud 点云对象。
if (-1 == io::loadPCDFile(strfilepath, *cloud)) {
cout << "error input!" << endl;
return -1;
}
cout << cloud->points.size() << endl;
visualization::CloudViewer viewer("Cloud Viewer: Rabbit");
// showCloud 方法会将点云加载到可视化窗口。
viewer.showCloud(cloud);
// 注册回调函数 viewerOneOff,该函数会在可视化器初始化后立即执行一次,用于设置背景颜色等。
viewer.runOnVisualizationThreadOnce(viewerOneOff);
system("pause");
return 0;
}
点云文件格式
- 文件结构
PCD(Point Cloud Data)和 PLY(Polygon File Format)是两种用于存储三维点云数据的文件格式
- PCD格式:
是 PCL(Point Cloud Library)专用的文件格式,设计用于存储点云数据。
有两种数据存储格式:ASCII和二进制(binary)。ASCII格式是文本格式,易于读取和编辑;二进制格式更紧凑,适合存储大规模点云。
包含点云的属性信息,例如坐标(x, y, z)、颜色(rgb)、法线(normal)等,字段名称灵活。 - PLY格式:
是一种通用的三维模型文件格式,最初为保存多边形网格而设计,但也可用于存储点云。
同样支持ASCII和二进制两种格式。ASCII格式方便调试,二进制格式占用空间小。
文件可以包含点的颜色、法线等属性,但不如PCD格式灵活。在点云应用中,PLY格式通常用于数据交换。
- 应用场景
- PCD格式:
主要用于点云处理领域,特别是在PCL库中,用于存储点云数据、传输点云数据等。适合与PCL库的其他数据处理功能无缝集成。
常见于3D扫描、SLAM(即时定位与地图构建)、机器人和计算机视觉等领域。 - PLY格式:
更广泛应用于三维模型存储,如三维扫描模型、CAD模型和计算机图形学。
兼容性更强,可以在不同的三维建模软件中使用,例如MeshLab和Blender等。
- 灵活性与兼容性
- PCD格式:灵活性高,可以方便地添加或移除字段。对于PCL的用户来说,这个格式使用起来最简便,但其他非PCL程序的支持较少。
- PLY格式:兼容性强,可以在PCL以外的软件中广泛使用,但对于特定字段的扩展性不如PCD。
pcd数据示例
# .PCD v0.7 - Point Cloud Data file format
VERSION 0.7
FIELDS x y z rgb intensity normal_x normal_y normal_z label
SIZE 4 4 4 4 4 4 4 4 4
TYPE F F F F F F F F I
COUNT 1 1 1 1 1 1 1 1 1
WIDTH 5
HEIGHT 1
VIEWPOINT 0 0 0 1 0 0 0
POINTS 5
DATA ascii
0.0 0.0 0.0 255 0.5 0.0 0.0 1.0 0
1.0 0.0 0.0 255 0.7 0.0 0.0 1.0 1
1.0 1.0 0.0 255 0.8 0.0 0.0 1.0 2
0.0 1.0 0.0 255 0.6 0.0 0.0 1.0 3
0.5 0.5 1.0 255 0.9 0.0 0.0 1.0 4
// 表示点云数据格式的版本号,0.7是最常用的版本
// FIELDS 字段定义了点云数据中每个点包含的属性(字段)。x, y, z 是最常见的字段,表示三维坐标,但 .pcd 格式支持更多的字段类型,具体取决于你想要存储哪些数据。
常见的 FIELDS 字段除了 x, y, z 之外,FIELDS 字段还可以包括以下常见属性:
- rgb: 表示每个点的颜色,通常存储为一个整数值(可以通过编码 RGB 分量,例如将 R, G, B 组合成一个 32 位整数)。
R (红色):占用最高的 8 位(24-31 位)。
G (绿色):占用中间的 8 位(16-23 位)。
B (蓝色):占用最低的 8 位(8-15 位)。
通常还有 8 位的透明度 (Alpha, A) 分量,占用最低的 8 位(0-7 位)。在 .pcd 文件中,透明度一般不使用,直接置为 0。
格式:rgb 字段通常存储为一个单一的整数值,表示点的 RGB 颜色。- intensity: 表示每个点的强度值,通常用于激光雷达(LiDAR)数据,表示每个点的反射强度。
格式:intensity 字段通常是一个浮动或整数值。- normal_x, normal_y, normal_z: 用于表示法线向量的三个分量,描述点云表面的朝向。
格式:每个法线分量通常是浮动值。- curvature: 点云的曲率值,通常用来描述点云表面的曲率变化。
格式:浮动值。- label: 用于标注点云中每个点的类别,常用于语义分割任务中,表示该点属于哪个物体类别。
格式:整数或字符串,具体取决于任务需求。
SIZE: 每个字段的字节数,这里每个值为 4 字节,表示浮点型。
TYPE: 每个字段的数据类型,这里 F 表示浮点型。
COUNT: 每个字段的计数(通常为 1)。
WIDTH: 点的数量(如果 HEIGHT 为 1,即为单行数据)。
HEIGHT: 行数(设置为 1 表示数据为一维,即单行)。
VIEWPOINT: 相机视点的姿态(位置和方向)。 VIEWPOINT 这里包含 7 个数值:
tx (平移 x):相机沿 x 轴的平移位置。
ty (平移 y):相机沿 y 轴的平移位置。
tz (平移 z):相机沿 z 轴的平移位置。
qw (旋转 w):表示方向的四元数的实部。
qx (旋转 x):四元数的 x 分量。
qy (旋转 y):四元数的 y 分量。
qz (旋转 z):四元数的 z 分量。
前三个数字(tx, ty, tz)表示相机在 3D 空间中的位置,即相机的位置。
后四个数字(qw, qx, qy, qz)构成了一个四元数,用于表示相机的旋转方向。四元数是一种常用的 3D 旋转表示方法,具有无奇异性的优势,适合描述旋转方向。具体来说:
四元数 是一种表示 3D 旋转的方式。它包含一个实部 qw 和三个虚部 qx, qy, qz,可以方便地表示空间中的旋转而不产生“万向节锁”问题。
方向 定义了从此视点观看点云的角度,即相机的朝向。
POINTS: 点的总数
DATA: 数据存储格式,这里是 ascii 表示文本格式(也可为 binary)。
ply数据示例
请看这位帅哥的博客