void estimateNormals (const typename PointCloud<PointT>::ConstPtr &input, PointCloud<Normal> &normals) { if (input->isOrganized ()) { IntegralImageNormalEstimation<PointT, Normal> ne; // Set the parameters for normal estimation ne.setNormalEstimationMethod (ne.COVARIANCE_MATRIX); ne.setMaxDepthChangeFactor (0.02f); ne.setNormalSmoothingSize (20.0f); // Estimate normals in the cloud ne.setInputCloud (input); ne.compute (normals); // Save the distance map for the plane comparator float *map=ne.getDistanceMap ();// This will be deallocated with the IntegralImageNormalEstimation object... distance_map_.assign(map, map+input->size() ); //...so we must copy the data out plane_comparator_->setDistanceMap(distance_map_.data()); } else { NormalEstimation<PointT, Normal> ne; ne.setInputCloud (input); ne.setRadiusSearch (0.02f); ne.setSearchMethod (search_); ne.compute (normals); } }
template <typename PointT> QList <pcl::cloud_composer::CloudComposerItem*> pcl::cloud_composer::OrganizedSegmentationTool::performTemplatedAction (QList <const CloudComposerItem*> input_data) { QList <CloudComposerItem*> output; foreach (const CloudComposerItem* input_item, input_data) { QVariant variant = input_item->data (ItemDataRole::CLOUD_TEMPLATED); if ( ! variant.canConvert <typename PointCloud<PointT>::Ptr> () ) { qWarning () << "Attempted to cast to template type which does not exist in this item! (input list)"; return output; } typename PointCloud <PointT>::Ptr input_cloud = variant.value <typename PointCloud<PointT>::Ptr> (); if ( ! input_cloud->isOrganized ()) { qCritical () << "Organized Segmentation requires an organized cloud!"; return output; } }