Вземете вътрешни точки, които не са отхвърлени от разстоянието за кореспонденция в методите за регистрация на pcl.

Използвам изпълнението pcl на iterative closest point. Бих искал да мога да играя с вътрешните точки от всеки метод на регистрация, който използвам.

Класът registration има способността да изведе подравнен облак, когато се извика функцията за подравняване:

icp_.align(outcloud, guess);

А класът PCLBase има следната функция:

indices = icp_.getIndices();

За съжаление getIndices просто връща индексите за целия облак. Тествах в облак и излизащите (или входящите) стойности, отхвърлени чрез кореспонденция за разстояние, не изглеждат възстановими?

Проверих и има точки в облака, които трябваше да бъдат отхвърлени, вижте по-долу:

въведете описание на изображението тук


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


Отговори (2)


Въз основа на отговора на D.J.Duff, ето един начин да стигнете до съответните точки, въпреки че включва нарушаване на класа. Този наследява от класа 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#a98f1c16 0391fff07f34339b63286e228

Тъй като е защитен, вероятно трябва да подкласирате 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
Не бих го приел за нарушение. Алтернатива би била да поставите подходящ метод за достъп директно в класа. Сигурен съм, че upstream няма да има нищо против да изпратите и корекция, ако промяната е обмислена. - person D.J.Duff; 18.06.2014