我们说我有两个不同的c1
(尽管点类型并不重要),c2
和inter
。
我想找到这两个指向云的交汇点。
通过交集,我的意思是构造了点云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中找不到任何相关内容,但也许我错过了一些内容。
谢谢。
答案 0 :(得分:1)
通过使用KD Tree这样的高效数据结构,可以更有效地搜索contains
函数中的点数。
另一种选择是在您的管道中更早地进行更好的簿记,但我们需要更多地了解您想要达到的目标,以帮助您实现这一目标。
编辑:正如评论中所指出的,KD Tree适用于近似空间搜索,但提问者想要进行精确的点匹配。为此,哈希表(或其他一些基本搜索数据结构)可能更有效。