Библиотека облаков точек: ошибка при добавлении облака точек в средство просмотра визуализатора PCL

У меня есть файл облака точек (.pcd), из которого я сгенерировал нормали. Теперь я хочу отобразить облако входных точек вместе с сгенерированными нормалями в одном окне просмотра (а не в нескольких окнах просмотра). Код, который я разработал,

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/features/normal_3d.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/features/integral_image_normal.h>

int main ()
{
  // load point cloud
  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);

  if (pcl::io::loadPCDFile<pcl::PointXYZ> ("table_scene_mug_stereo_textured.pcd", *cloud) == -1) 
  {
    PCL_ERROR ("Couldn't read file table_scene_mug_stereo_textured.pcd \n");
    return (-1);
  }

  std::cout << "Loaded "
            << cloud->width * cloud->height
            << " data points from test_pcd.pcd with the following fields: "
            << std::endl;

  std::cout << "Input cloud Point Size "
            << cloud->points.size ()            
            << std::endl;

  // organized or unorganized normal estimation
  pcl::PointCloud<pcl::Normal>::Ptr cloud_normals (new pcl::PointCloud<pcl::Normal>);
  if (cloud->isOrganized ())
  {
    std::cout << "Computing normals Inside organized block " << std::endl;
    pcl::IntegralImageNormalEstimation<pcl::PointXYZ, pcl::Normal> ne;
    ne.setInputCloud (cloud);
    ne.setNormalEstimationMethod (ne.AVERAGE_3D_GRADIENT);    
    ne.setNormalSmoothingSize (float (0.03));
    ne.setDepthDependentSmoothing (true);
    ne.compute (*cloud_normals);    
  }
  else
  {
    std::cout << "Computing normals Inside non-organized block " << std::endl;
    pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;
    ne.setInputCloud (cloud);
    pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ> ());
    ne.setSearchMethod (tree);    
    ne.setRadiusSearch (0.03);
    ne.compute (*cloud_normals);
  }

  std::cout << "cloud_normals Point Size "<< cloud_normals->points.size () << std::endl;

  //write the normals to a PCD file
  pcl::PCDWriter writer;
  writer.write("computed_normals.pcd", *cloud_normals, false);

    // visualize normals
    pcl::visualization::PCLVisualizer viewer("PCL Viewer");
    viewer.setBackgroundColor (0.0, 0.0, 0.0);      
    viewer.addPointCloud< pcl::PointXYZRGB >( cloud, "cloud", 0);

    viewer.addPointCloudNormals<pcl::PointXYZ,pcl::Normal>(cloud, cloud_normals);    

    while (!viewer.wasStopped ())
    {
        viewer.spinOnce ();
    }
    return 0;
}

Когда я пытаюсь отладить код, я получаю сообщение об ошибке

ни один экземпляр перегруженной функции "pcl :: visualization :: PCLVisualizer :: addPointCloud" не соответствует списку аргументов

в соответствии

viewer.addPointCloud ‹pcl :: PointXYZRGB> (облако,« облако », 0);

Я сослался на документацию и провел некоторое время в Интернете, чтобы безуспешно решить эту проблему.

Правильно ли я добавляю облако точек в средство просмотра? Если нет, дайте мне знать, как правильно добавить облако точек в средство просмотра вместе с сгенерированными нормалями.


person Sjs    schedule 09.06.2018    source источник


Ответы (1)


Вы попытались добавить неверный тип облака точек. Измените строку на:

viewer.addPointCloud< pcl::PointXYZ >( cloud, "cloud", 0);

На этот вопрос также был дан ответ здесь:

http://www.pcl-users.org/Point-Cloud-Library-Error-while-adding-point-cloud-to-PCL-Visualizer-viewer-td4046232.html

Для получения дополнительной информации о типах облаков точек обратитесь к библиотеке PCL здесь: http://pointclouds.org/documentation/tutorials/adding_custom_ptype.php#what-pointt-types-are-available-in-pcl

person Flumenque    schedule 05.09.2018