读取的点云ASCII码文件,每行6个数据,3维坐标+3维法向
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/io/io.h>typedef pcl::PointXYZRGBNormal PointT; // 使用包含法向量的点类型int main(int argc, char** argv) {//if (argc != 2) {// std::cerr << "Usage: " << argv[0] << " <input_txt_file>" << std::endl;// return -1;//}// 1. 创建点云对象pcl::PointCloud<PointT>::Ptr cloud(new pcl::PointCloud<PointT>);// 2. 打开并读取TXT文件std::ifstream file("E:\\Data\\pn.txt");if (!file.is_open()) {std::cerr << "Error opening file: " << argv[1] << std::endl;return -1;}std::string line;while (std::getline(file, line)) {if (line.empty()) continue;std::istringstream iss(line);PointT point;// 读取坐标 (x,y,z) 和法向量 (nx,ny,nz)if (!(iss >> point.x >> point.y >> point.z>> point.normal_x >> point.normal_y >> point.normal_z)) {std::cerr << "Error parsing line: " << line << std::endl;continue;}// 设置点的颜色(可选)point.r = 255; // 红色point.g = 255; // 绿色point.b = 255; // 白色cloud->push_back(point);}file.close();// 3. 设置点云属性cloud->width = cloud->size();cloud->height = 1;cloud->is_dense = false;//std::cout << "Loaded " << cloud->size() << " points from " << argv[1] << std::endl;// 4. 可视化点云和法向量pcl::visualization::PCLVisualizer viewer("Point Cloud Viewer");// 添加点云viewer.addPointCloud<PointT>(cloud, "cloud");// 添加法向量(每10个点显示一个法向量,避免过于密集)viewer.addPointCloudNormals<PointT>(cloud, 2, 1.0, "normals");// 设置背景色viewer.setBackgroundColor(0.1, 0.1, 0.1);// 设置点云颜色属性viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "cloud");// 设置法线绘制的颜色属性viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR,1.0, 0.0, 0.0, // RGB值 (1.0,0.0,0.0)表示红色"normals");// 5. 主循环while (!viewer.wasStopped()) {viewer.spinOnce(100);}return 0;
}