使用PCL交叉PointClouds

时间:2015-07-15 07:04:30

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

我们说我有两个不同的c1(尽管点类型并不重要),c2inter

我想找到这两个指向云的交汇点。 通过交集,我的意思是构造了点云pi,以便c1中的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;
}

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

context_dict

我想知道是否有标准(可能更有效)的方法吗?

我在official documentation中找不到任何相关内容,但也许我错过了一些内容。

谢谢。

1 个答案:

答案 0 :(得分:1)

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

另一种选择是在您的管道中更早地进行更好的簿记,但我们需要更多地了解您想要达到的目标,以帮助您实现这一目标。

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