C++ 向查看器添加两个不同的点云(点云库(PCL))

C++ 向查看器添加两个不同的点云(点云库(PCL)),c++,point-cloud-library,point-clouds,C++,Point Cloud Library,Point Clouds,我刚开始使用great point cloud库,希望在一个查看器中显示两个点云,但每个点云的颜色不同 当我使用一个点云对象(指针?!)时,它可以正常工作,但是如果我想添加第二个点云对象,则查看器中将只显示第二个点云对象 我使用的是pcl版本1.6,与此非常相似。 也许你们有个建议 下面是相关的代码片段。提前感谢 boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer_two_clouds (new pcl::vis

我刚开始使用great point cloud库,希望在一个查看器中显示两个点云,但每个点云的颜色不同

当我使用一个点云对象(指针?!)时,它可以正常工作,但是如果我想添加第二个点云对象,则查看器中将只显示第二个点云对象

我使用的是pcl版本1.6,与此非常相似。
也许你们有个建议

下面是相关的代码片段。提前感谢

  boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer_two_clouds (new pcl::visualization::PCLVisualizer("3D Viewer"));
  viewer_two_clouds->setBackgroundColor(0,0,0);

     // cloud: green / cloud2: red
  pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZRGB> single_color1 (cloud, 0, 255, 0);
  pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZRGB> single_color2 (cloud2, 255, 0, 0);

  //add both
  viewer_two_clouds->addPointCloud<pcl::PointXYZRGB> (cloud, single_color1, "sample_cloud_1");
  viewer_two_clouds->addPointCloud<pcl::PointXYZRGB> (cloud2, single_color2, "sample_cloud_2");

  // set coordinateSystem and init camera
  viewer_two_clouds->addCoordinateSystem(1.0);
  viewer_two_clouds->initCameraParameters();

  while(!viewer_two_clouds->wasStopped())
  {
      viewer_two_clouds->spinOnce();
      boost::this_thread::sleep (boost::posix_time::microseconds(100000));
  }

  viewer_two_clouds->close();
boost::shared_ptr viewer_two_clouds(新的pcl::visualization::PCLVisualizer(“3D查看器”);
查看器\u两个\u云->setBackgroundColor(0,0,0);
//云:绿色/云2:红色
pcl::visualization::PointCloudColorHandlerCustom single_color1(云,0,255,0);
pcl::visualization::PointCloudColorHandlerCustom single_color2(cloud2,255,0,0);
//两者相加
查看器两个云->添加点云(云,单色1,“示例云1”);
viewer_two_clouds->addPointCloud(cloud2,单色2,“示例_cloud_2”);
//设置坐标系统和初始摄像机
查看器两个云->添加协调系统(1.0);
查看器_两个_云->initCameraParameters();
而(!viewer\u two\u clouds->wastopped())
{
查看器_两个_云->spinOnce();
boost::this_线程::sleep(boost::posix_时间::微秒(100000));
}
查看器_两个_云->关闭();

要将变换(如旋转和平移)应用于已加载的点云,应使用
pcl::transformPointCloud
函数()。此函数接受3个参数:输入云、输出云和
Eigen::Transform
。只需定义一个转换并将其输入函数,即可正确转换云

有一个很好的Eigen教程()向您展示了如何定义和使用空间变换。

Dexter帮助了我很多=)

下面是我用来转换点云的内容,以便其他人也可以使用它

  void trans (); 
    { 
       Eigen::Affine3f t;

       pcl::getTransformation(10.0,5.0,20.0,0.0,0.0,0.0,t);
       pcl::transformPointCloud(*cloud, *cloud2, t);   
    }

在一个查看器中显示两个点云还有其他方法。您可以在窗口上创建两个不同的视口,有些人这样认为:

viewer_two_clouds->createViewPort (0.0,0.0,0.5,1.0,0);
viewer_two_clouds->setBackgroundColor(0,0,0,0); // background color dark
viewer_two_clouds->addText("sample_cloud_1", 10, 10, "right", 0);
viewer_two_clouds->addPointCloud(cloud,  "sample_cloud_1", 0);

viewer_two_clouds->createViewPort (0.5,0.0,0.1,1.0,0);
viewer_two_clouds->setBackgroundColor(0.1,0.1,0.1,0); // background color light
viewer_two_clouds->addText("sample_cloud_2", 10, 10, "left", 0);
viewer_two_clouds->addPointCloud(cloud2,  "sample_cloud_2", 0);

这样,您可以看到两个点云彼此相隔(且不重叠)。

您是否检查过您没有加载相同的
PCD
?我实际上只加载了一个PCD,但我正在复制它,并将其移离另一个点云10米远。copyPointCloud(*cloud,*cloud2);/复制后,我执行cloud2->sensor\u origin\up;好啊然后,尝试加载文件两次,而不是复制。我不认为这能解决问题,但以防万一……嗯,不……那也不行。在调试过程中,我注意到我的cloud2对象中的点在我执行cloud2->sensor\u origin\uP时立即消失。是否有其他方法移动现有云?