使用仿射變換( Affine3f) 進行點雲的旋轉平移
注意算法中設置的角度是弧度制,不是角度制。
參考鏈接:標籤:"PCL"相關文章
代碼實現
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_cloud.h>
#include <pcl/console/parse.h>
#include <pcl/common/transforms.h> // pcl::transformPointCloud 用到這個頭文件
#include <pcl/visualization/pcl_visualizer.h>
using namespace std;
int
main(int argc, char **argv) {
// 加載點雲數據文件
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>());
pcl::io::loadPCDFile("A3 - Cloud.pcd", *cloud);
Eigen::Affine3f transform = Eigen::Affine3f::Identity();//初始化變換矩陣爲單位矩陣
// 在 X 軸上定義一個 1米的平移.
transform.translation() << 1.0, 0.0, 0.0;
// 旋轉; Z 軸上旋轉0 弧度,Y軸上旋轉0弧度
transform.rotate(Eigen::AngleAxisf(0, Eigen::Vector3f::UnitZ()));
transform.rotate(Eigen::AngleAxisf(0, Eigen::Vector3f::UnitY()));
// 打印變換矩陣
cout<<"變換矩陣爲:" << transform.matrix() << endl;
// 執行變換,並將結果保存在新創建的 transformed_cloud 中
pcl::PointCloud<pcl::PointXYZ>::Ptr transformed_cloud(new pcl::PointCloud<pcl::PointXYZ>());
pcl::transformPointCloud(*cloud, *transformed_cloud, transform);
pcl::io::savePCDFileASCII("A3 - Cloud1.pcd", *transformed_cloud);
cout << "原始點雲顯示爲白色,變換後的點云爲紅色" << endl;
pcl::visualization::PCLVisualizer viewer("Affine3f transformation example");
// 爲點雲定義 R,G,B 顏色
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> source_cloud_color_handler(cloud, 255, 255, 255);
// 輸出點雲到查看器,使用顏色管理
viewer.addPointCloud(cloud, source_cloud_color_handler, "original_cloud");
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> transformed_cloud_color_handler(transformed_cloud, 230, 20, 20); // 紅
viewer.addPointCloud(transformed_cloud, transformed_cloud_color_handler, "transformed_cloud");
viewer.setBackgroundColor(0.05, 0.05, 0.05, 0); // 設置背景爲深灰
viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "original_cloud");
viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "transformed_cloud");
//viewer.setPosition(800, 400); // 設置窗口位置
while (!viewer.wasStopped()) { // 在按下 "q" 鍵之前一直會顯示窗口
viewer.spinOnce();
}
return 0;
}