txt转pcd//点云的刚性变换

本文详细介绍了一种将TXT格式的点云数据转换为PCD格式的方法,并利用PCL库进行点云的刚性变换及可视化展示。通过具体代码实例,展示了如何读取TXT文件中的点云数据,将其转换为PCL支持的点云格式并保存为PCD文件,以及如何应用矩阵变换实现点云的旋转和平移,最后通过可视化窗口展示变换前后的点云效果。

1.txt转pcd格式

#include<iostream>
#include<fstream>
#include <string>
#include <vector>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
 
using namespace std;
 
typedef struct tagPOINT_3D
{
	double x;  //mm world coordinate x
	double y;  //mm world coordinate y
	double z;  //mm world coordinate z
	double r;

}POINT_WORLD;
 

int main()
{

/////加载txt数据
	int number_Txt;
	FILE *fp_txt;
	tagPOINT_3D TxtPoint;
	vector<tagPOINT_3D> m_vTxtPoints;
	fp_txt = fopen("D:\\Program files\\Project\\Smoothing\\test_data0_DEM.txt", "r");
 	if (fp_txt)
	{
		while (fscanf(fp_txt, "%lf %lf %lf", &TxtPoint.x, &TxtPoint.y, &TxtPoint.z) != EOF)
		{
			m_vTxtPoints.push_back(TxtPoint);
		}
	}
	else
		cout << "txt数据加载失败!" << endl;
	number_Txt = m_vTxtPoints.size();
	pcl::PointCloud<pcl::PointXYZ> cloud;

	// Fill in the cloud data
	cloud.width = number_Txt;
	cloud.height = 1;	
	cloud.is_dense = false;
	cloud.points.resize(cloud.width * cloud.height);

	for (size_t i = 0; i < cloud.points.size(); ++i)

	{
		cloud.points[i].x = m_vTxtPoints[i].x;
		cloud.points[i].y = m_vTxtPoints[i].y;
		cloud.points[i].z = m_vTxtPoints[i].z;
	}

	pcl::io::savePCDFileASCII("D:\\Program files\\Project\\Smoothing\\test_data0_DEM.pcd", cloud);
	std::cerr << "Saved " << cloud.points.size() << " data points to txt2pcd.pcd." << std::endl;


	for (size_t i = 0; i < cloud.points.size(); ++i)
	std::cerr << "    " << cloud.points[i].x << " " << cloud.points[i].y << " " << cloud.points[i].z << std::endl;

	system("pause");
	return 0;

}

2.点云的刚性变换

/*
* 功能: 点云刚体变换
* 头文件: #include <pcl/common/transforms.h>
* 功能函数: pcl::transformPointCloud(*pPointCloudIn, *pPointCloudOut, transform_1);
*/

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/common/transforms.h>

int main()
{
	// 1. 读入点云
	pcl::PointCloud<pcl::PointXYZ>::Ptr pPointCloudIn(new pcl::PointCloud<pcl::PointXYZ>());
	pcl::io::loadPCDFile("rabbit.pcd", *pPointCloudIn);

	// 2. 可视窗口初始化
	pcl::visualization::PCLVisualizer viewer;
	viewer.setCameraFieldOfView(0.785398);      // fov 大概45度
	viewer.setBackgroundColor(0.5, 0.5, 0.5);   // 背景设为灰色
	viewer.setCameraPosition(
		0, 0, 5,                                // camera位置
		0, 0, -1,                               // view向量--相机朝向
		0, 1, 0                                 // up向量
	);

	// 3. 点云变换
	
	Eigen::Matrix4f transform_1 = Eigen::Matrix4f::Identity();      // 单位阵
	
	transform_1(0, 1) = -0.75;
	transform_1(0, 2) = 0.5;
	transform_1(1, 0) = -0.85;
	transform_1(1, 2) = 1;
	transform_1(2, 0) = 0.25;
	transform_1(2, 1) = 0.7;
	
	// 定义沿着x轴平移20m
	transform_1(1, 3) = -20;

	// 打印变换矩阵
	printf("Method #1: using a Matrix4f\n");
	std::cout << transform_1 << std::endl;

	
	// 执行变换
	pcl::PointCloud<pcl::PointXYZ>::Ptr pPointCloudOut(new pcl::PointCloud<pcl::PointXYZ>());
	pcl::transformPointCloud(*pPointCloudIn, *pPointCloudOut, transform_1);

	// 4. 点云可视化
	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> inColorHandler(pPointCloudIn, 255, 255, 255);// 白色
	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> outColorHandler(pPointCloudOut, 230, 20, 20); // 红色
	viewer.addPointCloud(pPointCloudIn, inColorHandler, "In");
	viewer.addPointCloud(pPointCloudOut, outColorHandler, "Out");
	viewer.addCoordinateSystem(1.0, "cloud", 0);
	while (!viewer.wasStopped()) 
	{ // 显示,直到‘q’键被按下
		viewer.spinOnce();
	}

	std::system("pause");
	return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值