Скопируйте облако точек PCL с сохранением организации или Ransac + Расчет нормалей к поверхности

у меня есть облако точек

pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGBA>);

что я хочу скопировать в

pcl::PointCloud<pcl::PointXYZRGBA>::Ptr finalcloud (new pcl::PointCloud<pcl::PointXYZRGBA>);

при фильтрации на основе некоторых вставок, рассчитанных с помощью ransac.

std::vector<int> inliers;

Я в настоящее время делаю это как

pcl::copyPointCloud<pcl::PointXYZRGBA>(*cloud, inliers, *finalcloud);

Проблема:

Поскольку я хочу найти нормали для этого облака, мне нужно поддерживать организацию. Функция copyPointCloud делает новую высоту облака точек равной 1 (см. строку 188 документа PCL io.hpp< /а> ).

Кто-нибудь смог найти нормали после выполнения ransac на pcl?


person user1349663    schedule 11.02.2015    source источник
comment
Я не уверен, но не все процедуры (для нормальной оценки) нуждаются в организованных облаках точек. Это может сработать pointclouds.org/documentation/tutorials/   -  person Kornel    schedule 12.02.2015
comment
@Kornel Это был учебник, который я использовал, и для функции setInputCloud () требуется организованное облако точек.   -  person user1349663    schedule 12.02.2015
comment
уверены ли вы? здесь нет никаких ограничений для упорядоченного/неупорядоченного характера. Только версия OMP должна иметь организованные облака.   -  person Kornel    schedule 13.02.2015


Ответы (1)


Я думаю, что этот ответ слишком запоздал, и API может измениться с 2015 года... но я отвечу на него.

Обычная оценка будет работать как с организованным облаком, так и с неорганизованным облаком.

Неорганизованное облако

Я копирую код с http://pointclouds.org/documentation/tutorials/normal_estimation.php В этом коде KdTree будет использоваться для оценки соседей.

#include <pcl/point_types.h>
#include <pcl/features/normal_3d.h>

{
  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);

  ... read, pass in or create a point cloud ...

  // Create the normal estimation class, and pass the input dataset to it
  pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;
  ne.setInputCloud (cloud);

  // Create an empty kdtree representation, and pass it to the normal estimation object.
  // Its content will be filled inside the object, based on the given input dataset (as no other search surface is given).
  pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ> ());
  ne.setSearchMethod (tree);

  // Output datasets
  pcl::PointCloud<pcl::Normal>::Ptr cloud_normals (new pcl::PointCloud<pcl::Normal>);

  // Use all neighbors in a sphere of radius 3cm
  ne.setRadiusSearch (0.03);

  // Compute the features
  ne.compute (*cloud_normals);

  // cloud_normals->points.size () should have the same size as the input cloud->points.size ()*
}

Организованное облако

Я копирую код с http://www.pointclouds.org/documentation/tutorials/normal_estimation_using_integral_images.php#normal-estimation-using-integral-images

// load point cloud
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile ("table_scene_mug_stereo_textured.pcd", *cloud);

// estimate normals
pcl::PointCloud<pcl::Normal>::Ptr normals (new pcl::PointCloud<pcl::Normal>);

pcl::IntegralImageNormalEstimation<pcl::PointXYZ, pcl::Normal> ne;
ne.setNormalEstimationMethod (ne.AVERAGE_3D_GRADIENT);
ne.setMaxDepthChangeFactor(0.02f);
ne.setNormalSmoothingSize(10.0f);
ne.setInputCloud(cloud);
ne.compute(*normals);
person Ardiya    schedule 27.05.2019