【问题标题】:Intersection of PointClouds using PCL使用 PCL 的点云的交集
【发布时间】:2015-07-17 17:19:30
【问题描述】:

假设我有两个不同的pcl::PointCloud<pcl::PointXYZL>(尽管点类型并不重要),c1 和 c2。

我想找到这两个点云的交集。 通过交集,我的意思是点云inter 的构造使得来自c1 的点pi 插入inter,如果(且仅当)pj 存在于c2 中并且

pi.x == pj.x && pi.y == pj.y && pi.z == pj.z

目前我正在使用以下功能来实现这一点:

#include <pcl/point_cloud.h>
#include <pcl/point_types.h>

using namespace pcl;

typedef PointXYZL PointLT;
typedef PointCloud<PointLT> PointLCloudT;

bool contains(PointLCloudT::Ptr c, PointLT p) {
    PointLCloudT::iterator it = c->begin();
    for (; it != c->end(); ++it) {
        if (it->x == p.x && it->y == p.y && it->z == p.z)
            return true;
    }
    return false;
}

PointLCloudT::Ptr intersection(PointLCloudT::Ptr c1,
        PointLCloudT::Ptr c2) {
    PointLCloudT::Ptr inter;
    PointLCloudT::iterator it = c1->begin();
    for (; it != c1->end(); ++it) {
        if (contains(c2, *it))
            inter->push_back(*it);
    }

    return inter;
}

我想知道是否有标准(并且可能更有效)的方法来做到这一点?

我在official documentation 中没有找到任何关于此的信息,但也许我遗漏了一些东西。

谢谢。

【问题讨论】:

    标签: c++ point-cloud-library point-clouds


    【解决方案1】:

    如果您只是在寻找精确匹配,而不是近似匹配,您可以简单地将每个点云中的点放在 std::vector 中,对其进行排序,然后使用 std::set_intersection 来识别匹配。

    【讨论】:

    • 谢谢。我对这种方法的唯一担心是它们可能有不同的标签,因此向量应该只包含要正确比较的三个空间坐标。这样做,我丢失了标签信息,我必须在原始点云中检索它,我猜要再次遍历所有点。
    • 向量可以包含原始点数据。您需要使用仅使用坐标并忽略标签的自定义比较器。
    • 这似乎很合适...我会研究一下,谢谢!
    【解决方案2】:

    通过使用像KD Tree 这样的高效数据结构,可以更高效地搜索contains 函数中的点。

    另一种选择是在您的管道早期进行更好的簿记,但我们需要更多地了解您在高层次上试图实现的目标,以帮助您实现这一目标。

    编辑:正如 cmets 中所指出的,KD 树适用于近似空间搜索,但提问者想要进行精确的点匹配。为此,哈希表(或其他一些基本搜索数据结构)可能更有效。

    【讨论】:

    • 它会加快速度,但它会有点矫枉过正。 kD-tree 不是精确点查询的好结构。它专为近似点查询而设计。
    • 我的高级任务是将点云的分割(由我们正在研究的算法计算)与给定的地面实况分割进行比较。
    • @FrancescoV。不想偏离原始实现太远,但如果您要分割成两个以上的段 - 尤其是如果这些段没有与基本事实段的先前关联 -您应该考虑更正式和更强大的统计方法来衡量分歧。特别是en.wikipedia.org/wiki/Variation_of_information.
    • 你说得对,Sneftel。散列会更直接、更快。
    • 我也在计算 VOI,但我也想评估 Precision 和 Recall(以及 F 分数);对于那些我需要十字路口的人。
    猜你喜欢
    • 2019-06-10
    • 2015-11-16
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2020-09-20
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多