由于计算的结果,我正在处理一个点云,即点的向量,其中包含重复的点(最多为云的10%)。
我的实现是根据x,y和z值对这些点进行排序,然后使用该std::unique
函数。但是,即使排序本身似乎正在运行,生成的云仍包含重复项。
这是关键代码
bool comparePoint(pcl::PointXYZINormal p1, pcl::PointXYZINormal p2){
if (p1.x != p2.x)
return p1.x > p2.x;
else if (p1.y != p2.y)
return p1.y > p2.y;
else
return p1.z > p2.z;
}
bool equalPoint(pcl::PointXYZINormal p1, pcl::PointXYZINormal p2){
if (p1.x == p2.x && p1.y == p2.y && p1.z == p2.z)
return true;
return false;
}
void KDsearch::cullDuplePoints(){
std::sort(points.begin(), points.end(), comparePoint);
std::unique(points.begin(), points.end(), equalPoint);
}
这是输出点云(x,y和z坐标)的部分提取:
1.96828 -535.09515 2794.8391
1.96627 -636.95264 2914.0366
1.96627 -636.95264 2914.0366
1.9651 108.77433 2350.9841
1.9651 108.77433 2350.9841
1.9642299 -206.19427 5618.4629
1.9642299 -206.19427 5618.4629
1.96386 -1880.3784 1346.0654
难道是独特的无法正常工作,还是我的同等条件有误?
这些点本身也包含法线坐标,但是它们对于剔除并不重要,因此我没有在代码中使用它们。
std::unique
不会删除任何内容,它只会移动元素,并返回修改后的集合中唯一时间间隔的迭代器“过去”。
(未指定返回的迭代器之后的集合的实际内容。)
您需要明确删除重复项:
std::sort(points.begin(), points.end(), comparePoint);
auto unique_end = std::unique(points.begin(), points.end(), equalPoint);
points.erase(unique_end, points.end());
您还需要注意浮点比较。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句