PCL学习笔记(三)PCL的一些常用方法(不定期更新)

1.不同类型的点云之间进行类型转换

方法1:使用PCL库函数copyPointCloud

#include <pcl/common/impl/io.h>

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_xyz (new pcl::PointCloud<pcl::PointXYZ> ());
pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud_xyzrgba (new pcl::PointCloud<pcl::PointXYZRGBA> ());
pcl::copyPointCloud(*cloud_xyz, *cloud_xyzrgba);

方法2:手动转换

cloud_xyzrgba->points.resize(cloud_xyz->size());
for (size_t i = 0; i < cloud_xyz->points.size(); i++) {
 cloud_xyzrgb->points[i].x = cloud_xyz->points[i].x;
 cloud_xyzrgb->points[i].y = cloud_xyz->points[i].y;
 cloud_xyzrgb->points[i].z = cloud_xyz->points[i].z;
}

参考: PCL 不同类型的点云之间进行类型转换_AoboSir的博客-CSDN博客_pcl 不同类型 转换

2.旋转、平移点云

变换矩阵工作原理 :
|——-> 变换矩阵列
| 1 0 0 x | \
| 0 1 0 y | }-> 左边是一个3阶的单位阵(无旋转)
| 0 0 1 z | /
| 0 0 0 1 | -> 这一行用不到 (这一行保持 0,0,0,1)

方法1: 使用 Matrix4f
这个是“手工方法”,可以完美地理解,但容易出错

Eigen::Matrix4f transform_1 = Eigen::Matrix4f::Identity();

// 定义一个旋转矩阵 (见 https://en.wikipedia.org/wiki/Rotation_matrix)
float theta = M_PI/4; // 弧度角
transform_1 (0,0) = cos (theta);
transform_1 (0,1) = -sin(theta);
transform_1 (1,0) = sin (theta);
transform_1 (1,1) = cos (theta);
// (行, 列)

// 在 X 轴上定义一个 2.5 米的平移.
transform_1 (0,3) = 2.5;

// 执行变换,并将结果保存在新创建的 transformed_cloud 中
pcl::PointCloud<pcl::PointXYZ>::Ptr transformed_cloud (new pcl::PointCloud<pcl::PointXYZ> ());
// 可以使用 transform_1 或 transform_2; t它们是一样的
pcl::transformPointCloud (*source_cloud, *transformed_cloud, transform_1);
方法2:使用 Affine3f
这种方法简单,不易出错
Eigen::Affine3f transform_2 = Eigen::Affine3f::Identity();

// 在 X 轴上定义一个 2.5 米的平移.
transform_2.translation() << 2.5, 0.0, 0.0;

// 和前面一样的旋转; Z 轴上旋转 theta 弧度
transform_2.rotate (Eigen::AngleAxisf (theta, Eigen::Vector3f::UnitZ()));

// 执行变换,并将结果保存在新创建的 transformed_cloud 中
pcl::PointCloud<pcl::PointXYZ>::Ptr transformed_cloud (new pcl::PointCloud<pcl::PointXYZ> ());
// 可以使用 transform_1 或 transform_2; t它们是一样的
pcl::transformPointCloud (*source_cloud, *transformed_cloud, transform_2);

参考:PCL:旋转、平移点云_通哈膨胀哈哈哈的博客-CSDN博客