Получите дополнительные очки, не отклоненные расстоянием соответствия в методах регистрации pcl.

Я использую pcl реализацию iterative closest point. Я хотел бы иметь возможность играть с дополнительными баллами из любого метода регистрации, который я использую.

Класс registration имеет возможность выводить выровненное облако при вызове функции align:

icp_.align(outcloud, guess);

И класс PCLBase имеет следующую функцию:

indices = icp_.getIndices();

К сожалению, getIndices просто возвращает индексы для всего облака. Я провел тестирование в облаке, и выбросы (или выбросы), отклоненные дистанционной корреспонденцией, не могут быть восстановлены?

Я проверил, и в облаке есть точки, которые должны были быть отклонены, см. ниже:

введите здесь описание изображения


person Fantastic Mr Fox    schedule 16.06.2014    source источник


Ответы (2)


Основываясь на ответе DJDuff, вот один из способов получить соответствующие точки, хотя он включает нарушение класса. Этот наследуется от класса IterativeClosestPointNonLinear и может выступать в качестве замены. В моем случае я просто поместил его туда, где хотел использовать IterativeClosestPointNonLinear и иметь доступ к члену correspondences_. Аналогичный подход можно использовать для любого другого интерфейса регистрации.

/** \brief This is a mock class with the sole purpose of accessing a protected member of a class it inherits from.
*
* Some of the relevant documentation for correspondences: http://docs.pointclouds.org/trunk/correspondence_8h_source.html#l00092
*/
template <typename PointSource, typename PointTarget, typename Scalar = float>
class IterativeClosestPointNonLinear_Exposed : public pcl::IterativeClosestPointNonLinear<PointSource, PointTarget, Scalar> {
  public:
    pcl::CorrespondencesPtr getCorrespondencesPtr() {
      for (uint32_t i = 0; i < this->correspondences_->size(); i++) {
        pcl::Correspondence currentCorrespondence = (*this->correspondences_)[i];
        std::cout << "Index of the source point: " << currentCorrespondence.index_query << std::endl;
        std::cout << "Index of the matching target point: " << currentCorrespondence.index_match << std::endl;
        std::cout << "Distance between the corresponding points: " << currentCorrespondence.distance << std::endl;
        std::cout << "Weight of the confidence in the correspondence: " << currentCorrespondence.weight << std::endl;
      }
      return this->correspondences_;
    }
};

Вот несколько линий, проведенных между соответствующими точками между двумя облаками точек, полученными таким образом. Примечательно, что значение pcl::Correspondence.distance между двумя точками не всегда строго меньше, чем значение maxCorrespondenceDistance метода регистрации, поэтому вам, возможно, придется проверить расстояния, чтобы убедиться, что вы получаете только те соответствия, которые вам нужны.

Укажите соответствие между двумя облаками.

person Frogee    schedule 09.04.2016

Я думаю, вы можете получить желаемое с защищенным участником correspondences_:

http://docs.pointclouds.org/1.7.0/classpclcorrespondences_1_registration.html#a9222c160394f397e

Поскольку он защищен, вам, вероятно, следует создать подкласс ICP и добавить метод доступа.

Дополнительные сведения о том, как используется этот член, см.

http://docs.pointclouds.org/1.7.0/icp_8hpp_source.html

person D.J.Duff    schedule 16.06.2014
comment
ПРИМЕЧАНИЕ. Код ICP меняется в зависимости от версии PCL, поэтому смотрите код для своей версии. - person D.J.Duff; 16.06.2014
comment
Конечно, есть лучший способ, чем нарушение класса. Мне также пришлось бы реализовать свою собственную функцию для получения точек. Не то, чтобы это было проблемой, но я думал, что pcl подумал бы об этом? Спасибо за это, я начну внедрять, я бы не подумал наследоваться от icp, чтобы украсть его защищенные члены. - person Fantastic Mr Fox; 17.06.2014
comment
Я бы не считал это нарушением. В качестве альтернативы можно было бы поместить соответствующий метод доступа непосредственно в класс. Я уверен, что апстрим не возражал бы против того, чтобы вы прислали патч, если изменение будет продумано. - person D.J.Duff; 18.06.2014