?讀取的點云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;
}