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

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

最佳答案

关于评论

“好的。我会尽快检查它。您能告诉我使用cloud_viewer API设置相机参数和背景颜色吗?”

我不确定100%是否可以使用pcl::visualization::CloudViewer执行此操作。但是,如果将代码移到pcl::visualization::PCLVisualizer,则可以执行viewer.setBackgroundColor(double red,double green,double blue)(其中值的范围是0.1.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::PCLVisualizerpcl::visualization::CloudViewer::runOnVisualizationThreadOnce函数运行pcl::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::setBackgroundColor中的setBackground。为此,我认为使用直接pcl::visualization::PCLVisualizer更好。

关于c++ - 使用C++中的PCL在同一窗口中查看多个点云,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45783815/

10-11 04:33