Предположим, у меня есть два разных pcl::PointCloud<pcl::PointXYZL>
(хотя точечный тип на самом деле не имеет значения), c1
и c2
.Пересечение PointClouds с использованием PCL
Я хотел бы найти пересечение этих двух точечных облаков. пересечения Я имею в виду PointCloud 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;
}
Я хотел бы знать, если есть стандартный (и, возможно, более эффективный) способ сделать это?
Я ничего не нашел об этом в official documentation, но, возможно, мне что-то не хватает.
спасибо.
спасибо. Моя единственная забота об этом подходе заключается в том, что у них могут быть разные метки, поэтому векторы должны содержать только три пространственные координаты, которые должны быть правильно сопоставлены. Поступая таким образом, я теряю информацию о ярлыке, и мне нужно вернуть его обратно в исходное облако точек, и я все еще просматриваю все точки. –
Векторы могут содержать исходные точечные данные. Вам нужно использовать собственный компаратор, который использует только координаты и игнорирует метки. –
Это кажется подходящим ... Я загляну в него, спасибо! –