【发布时间】:2016-04-01 13:47:57
【问题描述】:
我正在处理一个点云,即一个点向量,作为计算的结果,其中包含重复的点(最多为云大小的 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
那么是 unique 不能正常工作还是我的同等条件有错误?
点本身也包含法线坐标,但它们对于剔除并不重要,所以我没有在代码中使用它们。
【问题讨论】:
-
你能告诉我们PointXYZNormal的定义吗?
-
请注意,
std::sort的比较函数应检查a是否小于b。如果你使用的是 C++11,你也可以使用std::tuple以整洁的方式进行字典比较:stackoverflow.com/questions/6218812 -
比较函数不需要检查小于,只要是严格的弱排序(就是这样)就可以了。
-
More 比您可能想知道的关于比较浮点值的信息,但是您仍然应该先看看,否则比较通过计算获得的浮点值是一种令人沮丧的练习(它总是会出现微妙的错误在某些情况下)。
-
您如何比较这些点以使相同的点彼此相邻?而是你背后的逻辑是什么?没关系,它很简单,我只是累了。=(
标签: c++ point-cloud-library point-clouds