【问题标题】:View multiple Point Clouds in same window using PCL in C++在 C++ 中使用 PCL 在同一窗口中查看多个点云
【发布时间】:2019-06-13 17:34:14
【问题描述】:

我有两个点云,我想在同一个窗口中进行可视化。

#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 工具,因为我需要对这些数据进行一些其他处理。

【问题讨论】:

    标签: c++ point-cloud-library


    【解决方案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 非常简单。

    #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;
    }
    

    编辑 确实有一种方法可以做到这一点。通过查看here,您可以看到您可以使用pcl::visualization::CloudViewer::runOnVisualizationThreadOncepcl::visualization::CloudViewer::runOnVisualizationThread 函数运行pcl::visualization::PCLVisualizer 的任何函数。为此,您需要创建一个函数来完成使用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::setBackgroundColorin setBackground。为此,我觉得直接使用pcl::visualization::PCLVisualizer会好很多。

    【讨论】:

      【解决方案2】:

      根据the pcl documentation,您可以为显示点云提供一个名称。
      如果您提供相同的名称,它会覆盖现有的云。

      这基本上意味着更改以下调用:

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

      与:

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

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

      【讨论】:

      • 好的。我会尽快检查的。你能告诉我使用 cloud_viewer API 设置相机参数和背景颜色吗?
      • 您认为PCL Visualizer 是更好的选择吗?是否可以在 PCL Visualizer 上查看多个云?
      • 可以使用runOnVisualizationThread()的方法。只需给它一个您想要在可视化线程上执行的功能。函数参数是 PCLVisualizer。老实说,我对 PCL 并不精通
      【解决方案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");
      

      【讨论】:

        猜你喜欢
        • 2013-12-07
        • 2013-04-10
        • 1970-01-01
        • 2017-12-31
        • 1970-01-01
        • 1970-01-01
        • 2012-07-19
        • 1970-01-01
        • 2014-03-24
        相关资源
        最近更新 更多