基于PCL库删除两个点云中相同点的C++代码示例
下面是一个使用 PCL 库实现的删除两个点云中相同点的 C++ 代码示例:
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/registration/icp.h>
#include <pcl/filters/extract_indices.h>
int main()
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud1(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud2(new pcl::PointCloud<pcl::PointXYZ>);
// 读取点云数据
pcl::io::loadPCDFile<pcl::PointXYZ>('clouds84.pcd', *cloud1);
pcl::io::loadPCDFile<pcl::PointXYZ>('clouds85.pcd', *cloud2);
// 创建一个点云配准对象
pcl::IterativeClosestPoint<pcl::PointXYZ, pcl::PointXYZ> icp;
icp.setInputSource(cloud1);
icp.setInputTarget(cloud2);
// 进行点云配准
pcl::PointCloud<pcl::PointXYZ> final_cloud;
icp.align(final_cloud);
// 获取配准后的点云
pcl::PointCloud<pcl::PointXYZ>::Ptr registered_cloud(new pcl::PointCloud<pcl::PointXYZ>);
*registered_cloud = final_cloud;
// 创建一个点云索引提取对象
pcl::ExtractIndices<pcl::PointXYZ> extract;
extract.setInputCloud(cloud1);
pcl::PointIndices::Ptr indices(new pcl::PointIndices());
// 遍历源点云中的每个点,并查找是否存在于目标点云中
for (int i = 0; i < cloud1->size(); ++i)
{
pcl::PointXYZ point = cloud1->at(i);
if (!pcl::isFinite(point)) continue; // 跳过无效点
std::vector<int> k_indices(1);
std::vector<float> k_distances(1);
if (cloud2->nearestKSearch(point, 1, k_indices, k_distances) > 0)
{
// 如果源点云中的点在目标点云中存在,则将其索引添加到索引列表中
indices->indices.push_back(i);
}
}
// 从源点云中提取相同点
pcl::PointCloud<pcl::PointXYZ>::Ptr filtered_cloud(new pcl::PointCloud<pcl::PointXYZ>);
extract.setIndices(indices);
extract.filter(*filtered_cloud);
// 保存结果
pcl::io::savePCDFile('filtered_cloud.pcd', *filtered_cloud);
return 0;
}
请注意,此代码使用了 PCL 库的 IterativeClosestPoint 类来进行点云配准,并使用 ExtractIndices 类从源点云中提取相同点。
原文地址: https://www.cveoy.top/t/topic/qqK2 著作权归作者所有。请勿转载和采集!