Лучшие практики для прохождения ЗКС::облако точек функции


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

void box_filter(pcl::PointCloud<pcl::PointXYZRGB>& in_cloud, pcl::PointCloud<pcl::PointXYZRGB>& out_cloud)
{
  pcl::CropBox<pcl::PointXYZRGB> filter;
  filter.setMin(Eigen::Vector4f(x_min, y_min, z_min, 1.0));
  filter.setMax(Eigen::Vector4f(x_max, y_max, z_max, 1.0));
  filter.setInputCloud(in_cloud);
  filter.filter(out_cloud);
}

Я определил точку облака следующим образом-

pcl::PointCloud<pcl::PointXYZRGB> raw_cloud, filterd_cloud;

Позже, я визуализирую отфильтрованный облаком, используя PCLVisualizer. Пожалуйста, см. фрагмент кода

pcl::PointCloud<pcl::PointXYZRGB> raw_cloud, filterd_cloud;
pcl::io::loadPCDFile(pcd_filename, raw_cloud);
box_filter(raw_cloud, filterd_cloud);
pcl::visualization::PCLVisualizer viewer("Cloud Viewer");
viewer.addPointCloud(filterd_cloud, "filterd_cloud");
viewer.spin();

К сожалению, код выдает следующие ошибки компиляции

In function ‘void box_filter(pcl::PointCloud<pcl::PointXYZRGB>&, pcl::PointCloud<pcl::PointXYZRGB>&)’:
error: no matching function for call to ‘pcl::CropBox<pcl::PointXYZRGB>::setInputCloud(pcl::PointCloud<pcl::PointXYZRGB>&)’
   filter.setInputCloud(in_cloud);
                                ^
candidate is: void pcl::PCLBase<PointT>::setInputCloud(const PointCloudConstPtr&) [with PointT = pcl::PointXYZRGB; pcl::PCLBase<PointT>::PointCloudConstPtr = boost::shared_ptr<const pcl::PointCloud<pcl::PointXYZRGB> >]
       setInputCloud (const PointCloudConstPtr &cloud);
       ^
error: no matching function for call to ‘pcl::visualization::PCLVisualizer::addPointCloud(pcl::PointCloud<pcl::PointXYZRGB>&, const char [14])’
   viewer.addPointCloud(filterd_cloud, "filterd_cloud");
                                                      ^
candidates are: template<class PointT> bool pcl::visualization::PCLVisualizer::addPointCloud(const typename pcl::PointCloud<PointT>::ConstPtr&, const string&, int)
         addPointCloud (const typename pcl::PointCloud<PointT>::ConstPtr &cloud,
         ^

Понятно, что есть несоответствие между типом данных, как ожидается, для pcl::PointCloud<PointT>::ConstPtr вместо pcl::PointCloud<PointT>.

Я изменил код, как показано ниже-

void box_filter(pcl::PointCloud<pcl::PointXYZRGB>::Ptr in_cloud, pcl::PointCloud<pcl::PointXYZRGB>::Ptr out_cloud)
{
  pcl::CropBox<pcl::PointXYZRGB> filter;
  filter.setMin(Eigen::Vector4f(x_min, y_min, z_min, 1.0));
  filter.setMax(Eigen::Vector4f(x_max, y_max, z_max, 1.0));
  filter.setInputCloud(in_cloud);
  filter.filter(*out_cloud);
}

и это тоже-

pcl::PointCloud<pcl::PointXYZRGB>::Ptr raw_cloud (new pcl::PointCloud<pcl::PointXYZRGB>);
pcl::PointCloud<pcl::PointXYZRGB>::Ptr filterd_cloud (new pcl::PointCloud<pcl::PointXYZRGB>);
pcl::io::loadPCDFile(pcd_filename, *raw_cloud);
box_filter(raw_cloud, filterd_cloud);
pcl::visualization::PCLVisualizer viewer("Cloud Viewer");
viewer.addPointCloud(filterd_cloud, "filterd_cloud");
viewer.spin();

Это работает, но это нормально? Я ищу лучшие практики при работе с pcl::PointCloud<PointT> как использовать импульс указатели.



1138
1
задан 9 февраля 2018 в 06:02 Источник Поделиться
Комментарии