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;
}