PCL去除同名点,去除重影点
void removeSamePoint(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in, pcl::PointCloud<pcl::PointXYZ>::Ptr &cloud_out, double radius)
{
//---------------------KD树半径搜索-------------------
pcl::KdTreeFLANN<pcl::PointXYZ> kdtree;
kdtree.setInputCloud(cloud_in);
std::vector<int> pointIdxRadiusSearch;
std::vector<float> pointRadiusSquaredDistance;
std::vector<int> total_index;
for (size_t i = 0; i < cloud_in->size(); ++i)
{
pcl::PointXYZ searchPoint = cloud_in->points[i];
if (kdtree.radiusSearch(searchPoint, radius, pointIdxRadiusSearch, pointRadiusSquaredDistance) > 0)
{
if (pointIdxRadiusSearch.size() != 1)
{
for (size_t j = 1; j < pointIdxRadiusSearch.size(); j++)
{
total_index.push_back(pointIdxRadiusSearch[j]);
}
}
}
}
//-----------------------删除重复索引-----------------------
sort(total_index.begin(), total_index.end());//将索引进行排序
total_index.erase(unique(total_index.begin(), total_index.end()), total_index.end());//将索引中的重复索引去除
//-------------------根据索引删除重复的点-------------------
pcl::PointIndices::Ptr outliners(new pcl::PointIndices());
outliners->indices.resize(total_index.size());
for (size_t i = 0; i < total_index.size(); i++)
{
outliners->indices[i] = total_index[i];
}
pcl::ExtractIndices<pcl::PointXYZ> extract;
extract.setInputCloud(cloud_in);
extract.setIndices(outliners);
extract.setNegative(true);//设置为true则表示保存索引之外的点
extract.filter(*cloud_out);
std::cout << "cloud_in:" << cloud_in->points.size() << std::endl;
std::cout << "total_index:" << total_index.size() << std::endl;
std::cout << "cloud_out:" << cloud_out->points.size() << std::endl;
}
图片: