PCL专栏目录及须知-优快云博客
1.原理
矩阵变换
2.使用场景
需点云变换的场景
3.注意事项
刚体变换只包括平移、旋转。变换后两点距离保持不变。
仿射变换包括平移、旋转、缩放、倾斜。变换后保持平直性、平行性。
Eigen::Isometry3d用于刚体变换(只包含平移旋转,不包含缩放),如果要加入缩放,那么在变换后再添加一个缩放的矩阵即可。
4.关键函数
(1)缩放【如果要缩放,那么先执行缩放】
Eigen::Isometry3d mat = Eigen::Isometry3d::Identity();
mat= Eigen::Scaling(0.5);
(2)刚体变换(执行完缩放之后,再执行平移和旋转)
// 平移
Eigen::Isometry3d mat = Eigen::Isometry3d::Identity(); // 单位矩阵
mat.translate(Eigen::Vector3d(1.0, 1.0, 1.0)); // 设置平移参数(X轴、Y轴、Z轴)【translate为左乘,pretranslate为右乘】
// 旋转【角度使用弧度制,旋转轴使用向量】【rotate为左乘,prerotate为右乘】
mat.rotate(Eigen::AngleAxisd(M_PI / 4, Eigen::Vector3d(1, 0, 0))); // 设置旋转参数(旋转角度、旋转轴)【沿x轴旋转45°】
5.代码
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_cloud.h>
#include <pcl/common/transforms.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <boost/thread/thread.hpp>
int main()
{
/****************刚体变换********************/
// 原始点云
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile("D:/code/csdn/data/rabbit.pcd", *cloud_in); // 加载原始点云数据
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_out(new pcl::PointCloud<pcl::PointXYZ>); // 结果点云
// 变换矩阵
// 缩放【最好是第一步】
Eigen::Isometry3d mat_scale = Eigen::Isometry3d::Identity();
mat_scale = Eigen::Scaling(0.5);
pcl::transformPointCloud(*cloud_in, *cloud_in, mat_scale.matrix()); // 缩放变换
// 平移【缩放变换完之后再进行平移旋转】
Eigen::Isometry3d mat = Eigen::Isometry3d::Identity(); // 单位矩阵
mat.translate(Eigen::Vector3d(0.1, 0.1, 0.1)); // 设置平移参数(X轴、Y轴、Z轴)【translate为左乘,pretranslate为右乘】
// 旋转【角度使用弧度制,旋转轴使用向量】【rotate为左乘,prerotate为右乘】
mat.rotate(Eigen::AngleAxisd(M_PI / 4, Eigen::Vector3d(1, 0, 0))); // 设置旋转参数(旋转角度、旋转轴)【沿x轴旋转45°】
mat.rotate(Eigen::AngleAxisd(M_PI / 4, Eigen::Vector3d(0, 1, 0))); // 设置旋转参数(旋转角度、旋转轴)【沿y轴旋转45°】
mat.rotate(Eigen::AngleAxisd(M_PI / 4, Eigen::Vector3d(0, 0, 1))); // 设置旋转参数(旋转角度、旋转轴)【沿z轴旋转45°】
// 平移旋转变换
pcl::transformPointCloud(*cloud_in, *cloud_out, mat.matrix()); // 刚体变换
pcl::io::savePCDFileBinary("D:/code/csdn/data/rabbit_1.pcd", *cloud_out); // 保存点云
}
6.结果展示
左侧为变换前,右侧为变换后