PCL 實現點雲平移旋轉

使用仿射變換( 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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章