2015-07-15 5 views
4

Предположим, у меня есть два разных 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, но, возможно, мне что-то не хватает.

спасибо.

ответ

4

Если вы ищете только точные соответствия, в отличие от приблизительных совпадений, вы можете просто поместить точки из каждого облака точек в std::vector, отсортировать его, а затем использовать std::set_intersection для определения совпадений.

+0

спасибо. Моя единственная забота об этом подходе заключается в том, что у них могут быть разные метки, поэтому векторы должны содержать только три пространственные координаты, которые должны быть правильно сопоставлены. Поступая таким образом, я теряю информацию о ярлыке, и мне нужно вернуть его обратно в исходное облако точек, и я все еще просматриваю все точки. –

+1

Векторы могут содержать исходные точечные данные. Вам нужно использовать собственный компаратор, который использует только координаты и игнорирует метки. –

+0

Это кажется подходящим ... Я загляну в него, спасибо! –

1

Этот поиск точек в вашей функции contains может быть сделан более эффективным с использованием эффективной структуры данных, такой как KD Tree.

Еще одна альтернатива заключается в том, чтобы лучше вести бухгалтерский учет ранее в вашем конвейере, но нам нужно будет узнать больше о том, чего вы пытаетесь достичь на высоком уровне, чтобы помочь вам в этом.

Редактировать: Как указано в комментариях, KD Tree подходит для приблизительного пространственного поиска, но спрашивающий хочет выполнить точные совпадения. Для этого хэш-таблица (или некоторые другие основные структуры данных поиска) может быть более эффективной.

+0

Это ускорило бы все, но это было бы излишним. KD-дерево не является хорошей структурой для точных точечных запросов. Он предназначен для приближенных точечных запросов. – Sneftel

+0

Моя задача высокого уровня - сравнить сегментирование pointcloud (вычисляемое по алгоритму, который мы исследуем) с заданной сегментацией земной истины. –

+1

@FrancescoV. Не хотите заходить слишком далеко от первоначальной реализации, но если вы сегментируете более чем два сегмента - и * особенно *, если сегменты не имеют предшествующих ассоциаций с сегментами от истины на земле, вы должны рассмотреть более формализованные и мощные статистические методы измерения дивергенции. В частности, https://en.wikipedia.org/wiki/Variation_of_information. – Sneftel

Смежные вопросы