查看下使用PCL在同一个窗口中的多个点云++(View multiple Point Clouds

2019-10-28 16:07发布

我有两个点云,我想在同一个窗口直观。

#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/cloud_viewer.h>

int main ()
{
    pcl::visualization::CloudViewer viewer("Cloud Viewer");

    pcl::PointCloud<pcl::PointXYZRGBA>::Ptr body (new pcl::PointCloud<pcl::PointXYZRGBA>);
    pcl::io::loadPCDFile ("body.pcd", *body);

    pcl::PointCloud<pcl::PointXYZRGBA>::Ptr head (new pcl::PointCloud<pcl::PointXYZRGBA>);
    pcl::io::loadPCDFile ("head.pcd", *head);

    viewer.showCloud (body);
    viewer.showCloud (head);
    while (!viewer.wasStopped ())
    {
    }
    return 0;
}

我只能看到最后的PCD文件。

请注意,我不希望因为我需要做的数据有一些其他处理中使用pcd_viewer工具。

Answer 1:

至于评论

“好吧,我会尽快检查一下。你能告诉我使用cloud_viewer API来设置相机参数和背景颜色?”

我不是100%肯定,如果你能做到这一点使用pcl::visualization::CloudViewer 。 但是,如果你移动你的代码到pcl::visualization::PCLVisualizer你可以做viewer.setBackgroundColor(double red,double green,double blue) (其中值范围0..1。要设置相机)。 对于摄像头,你可以使用pcl::visualization::PCLVisualizer::setCameraPosition 。 移动从CloudViewer你的代码PCLVisualizer是preatty容易。

#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>

int main ()
{
    pcl::visualization::PCLVisualizer viewer("Cloud Viewer");

    pcl::PointCloud<pcl::PointXYZRGBA>::Ptr body (new pcl::PointCloud<pcl::PointXYZRGBA>);
    pcl::io::loadPCDFile ("body.pcd", *body);

    pcl::PointCloud<pcl::PointXYZRGBA>::Ptr head (new pcl::PointCloud<pcl::PointXYZRGBA>);
    pcl::io::loadPCDFile ("head.pcd", *head);

    viewer.addPointCloud (body,"body");// note that before it was showCloud
    viewer.addPointCloud (head,"head");// note that before it was showCloud
    viewer.spin();
    return 0;
}

编辑疗法是实际上可以一个办法做到这一点。 通过寻找到这里 ,你可以看到,你可以运行任何功能的pcl::visualization::PCLVisualizer使用pcl::visualization::CloudViewer::runOnVisualizationThreadOncepcl::visualization::CloudViewer::runOnVisualizationThread功能。 对于这一点,你需要创建一个不使用的所有部位的功能pcl::visualization::PCLVisualizer并把它传递给CloudViewer::runOnVisualizationThreadOnceCloudViewer::runOnVisualizationThread

例如

#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/cloud_viewer.h>

void 
setBackground (pcl::visualization::PCLVisualizer& viewer)
{
    viewer.setBackgroundColor (1.0, 0.5, 1.0);    
}

int main ()
{
    pcl::visualization::PCLVisualizer viewer("Cloud Viewer");

    pcl::PointCloud<pcl::PointXYZRGBA>::Ptr body (new pcl::PointCloud<pcl::PointXYZRGBA>);
    pcl::io::loadPCDFile ("body.pcd", *body);

    pcl::PointCloud<pcl::PointXYZRGBA>::Ptr head (new pcl::PointCloud<pcl::PointXYZRGBA>);
    pcl::io::loadPCDFile ("head.pcd", *head);

    viewer.showCloud (body,"body");
    viewer.showCloud (head,"head");

    viewer.runOnVisualizationThreadOnce(setBackground);

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

唯一的问题是,我不知道你怎么可能将参数传递给pcl::visualization::PCLVisualizer功能要在我们装箱函数使用(在前面的例子中pcl::visualization::PCLVisualizer::setBackgroundColorsetBackground 。对于这一点,我觉得直接使用pcl::visualization::PCLVisualizer要好得多。



Answer 2:

按照该PCL文档 ,你可以为显示点云的名称。
如果您提供了相同的名称,它将覆盖现有的云。

这基本上意味着更改以下电话:

viewer.showCloud (body);
viewer.showCloud (head);

附:

viewer.showCloud (body, "body");
viewer.showCloud (head, "head");

当然你可以使用任何你想要的名字。



Answer 3:

  pclPointCloud<pcl::PointXYZ>::Ptr head (new pcl::PointCloud<pcl::PointXYZ>);
  pcl::PointCloud<pcl::PointXYZ>::Ptr body (new pcl::PointCloud<pcl::PointXYZ>);

 //initialize the point cloud viewer
  pcl::visualization::PCLVisualizer viewer ("");

 //visualize head
  pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ>  source_cloud_color_handler (head, 230, 20, 20);
  viewer.addPointCloud (head, source_cloud_color_handler, "head");

  //visualize body
  pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> transformed_cloud_color_handler (body, 255, 255, 255); // Whiite
  viewer.addPointCloud (body, transformed_cloud_color_handler, "body");

  viewer.addCoordinateSystem (1.0, "body", 0);
  viewer.setBackgroundColor(0.05, 0.05, 0.05, 0); // Setting background to a dark grey
  viewer.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "head");


文章来源: View multiple Point Clouds in same window using PCL in C++