如何在PCL中将局部与全局描述符保存为TXT而非PCD格式?
将PCL生成的点云描述符保存为TXT文件
针对你用PCL脚本生成局部/全局描述符后,Python加载PCD格式遇到问题的情况,直接修改C++脚本添加TXT保存逻辑即可,以下是具体实现:
一、保存局部描述符(每个点对应一个描述符,如FPFH、SHOT)
假设你的脚本中已经生成了类型为pcl::PointCloud<pcl::FPFHSignature33>的局部描述符点云(以FPFH为例,33维),在原PCD保存代码(第105行)附近添加以下代码:
// 打开TXT文件准备写入 std::ofstream local_desc_out("local_descriptors.txt"); if (!local_desc_out.is_open()) { std::cerr << "Failed to open file for local descriptors!" << std::endl; return -1; } // 可选:先写入描述符的数量和维度,方便Python读取 local_desc_out << local_desc_cloud->size() << " " << 33 << "\n"; // 遍历每个描述符,逐行写入 for (const auto& desc : *local_desc_cloud) { for (int i = 0; i < 33; ++i) { local_desc_out << desc.histogram[i] << " "; } local_desc_out << "\n"; } local_desc_out.close();
注意:
- 将
pcl::FPFHSignature33和33替换为你实际使用的描述符类型(如SHOT134对应134维) - 若不需要头部的数量和维度信息,可删除对应行
二、保存全局描述符(单个向量,如VFH、GlobalFeature)
如果是全局描述符(比如单个308维的VFH特征),添加以下代码:
std::ofstream global_desc_out("global_descriptor.txt"); if (!global_desc_out.is_open()) { std::cerr << "Failed to open file for global descriptor!" << std::endl; return -1; } // 遍历全局描述符的所有元素,写入一行 for (int i = 0; i < 308; ++i) { global_desc_out << global_desc.histogram[i] << " "; } global_desc_out << "\n"; global_desc_out.close();
注意:替换308为你使用的全局描述符维度,global_desc为你的全局描述符变量名
三、Python加载TXT描述符
保存完成后,在Python中用numpy即可轻松加载:
import numpy as np # 加载局部描述符(如果保留了头部行,跳过第一行) local_descriptors = np.loadtxt("local_descriptors.txt", skiprows=1) # 或无头部行直接加载:local_descriptors = np.loadtxt("local_descriptors.txt") # 加载全局描述符 global_descriptor = np.loadtxt("global_descriptor.txt")
内容的提问来源于stack exchange,提问作者Haalum
相关产品推荐
相关产品推荐

