从pcl :: people :: PersonCluster <pointt>中提取Point Cloud

时间:2015-05-12 10:54:45

标签: c++ detection point-cloud-library

我正在为大学做一个项目,我需要提取人们的点云来使用它。我创建了一个ROS节点来调整教程Ground based rgdb people detection的代码,现在我想在一个主题中发布第一个检测到的集群的点云。

但是我无法提取那个点云,这里定义了类person_cluster.h。还有一位公众成员:

typedef pcl::PointCloud<PointT> PointCloud;

所以要转换为sensor_msgs::PointCloud2我做:

pcl_conversions::fromPCL(clusters.at(0).PointCloud,person_msg);

其中person_msgPointCLoud2消息,clusterspcl::people::PersonCluster<PointT>的向量,我想只发布第一个点云,因为我认为只有一个人在场景中。

编译器给出了这个错误:

  

错误:无效使用'pcl :: people :: PersonCluster :: PointCloud'        pcl_conversions :: fromPCL(clusters.at(0).PointCloud,person_msg);

我对C ++没有太多了解,但我无法克服这个错误。谷歌搜索该错误似乎在你没有“定义”一个类时出现,但我怀疑在pcl库中他们定义了一个类坏。

1 个答案:

答案 0 :(得分:0)

对于那些感兴趣的人,我解决了我的问题。

在pcl的论坛中,我找到了一个post,我使用的人物检测器的同一个开发人员给出了答案。 所以基本上:

// Get cloud after voxeling and ground plane removal:
      PointCloudT::Ptr no_ground_cloud (new PointCloudT);
      no_ground_cloud = people_detector.getNoGroundCloud();

      // Show pointclouds of every person cluster:
      PointCloudT::Ptr cluster_cloud (new PointCloudT);
      for(std::vector<pcl::people::PersonCluster<PointT> >::iterator it = clusters.begin(); it != clusters.end(); ++it)
      {
        if (it->getPersonConfidence() > min_confidence)
        {
          // Create the pointcloud with points belonging to the current cluster:
          cluster_cloud->clear();
          pcl::PointIndices clusterIndices = it->getIndices();    // cluster indices
          std::vector<int> indices = clusterIndices.indices;
          for(unsigned int i = 0; i < indices.size(); i++)        // fill cluster cloud
          {
            PointT* p = &no_ground_cloud->points[indices[i]];
            cluster_cloud->push_back(*p);
          }

          // Visualization:
          viewer.removeAllPointClouds();
          viewer.removeAllShapes();
          pcl::visualization::PointCloudColorHandlerRGBField<PointT> rgb(cluster_cloud);
          viewer.addPointCloud<PointT> (cluster_cloud, rgb, "cluster_cloud");
          viewer.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "cluster_cloud");
          viewer.spinOnce(500);
        }
      }

实际上,我无法在传感器消息PointCloud2中转换此类点云,甚至尝试在pcl::PointCloud<pcl::PointXYZ>中转换该点云。

一个有效的解决方案就是使用cluster_cloud作为pcl::PointCloud<pcl::PointXYZ>类型,然后使用类型的发布商 pcl::PointCloud<pcl::PointXYZ> 这样:

ros::Publisher person_pub = nh.advertise<PointCloud>("personPointCloud", 1000);

无论如何它没有发布什么,rviz没有显示任何东西。但是viever正在显示被检测人员的点云。因为那个点云并不是我所期望的(如果你移动手臂,算法没有给你所有的手臂)它对我的项目没用,所以我放弃它。

因此在ros中发布它仍然存在问题,但是解决了获得pointcloud的问题。