c++ - 在 C++ 中使用 PCL 在同一窗口中查看多个点云

标签 c++ point-cloud-library

我有两个点云,我想在同一个窗口中显示它们。

#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. 设置相机)。对于相机,您可以使用 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::runOnVisualizationThreadOnce 运行 pcl::visualization::PCLVisualizer 的任何功能>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::setBackgroundColorsetBackground中,我觉得直接用pcl::visualization::PCLVisualizer就可以了更好。

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

相关文章:

3d - 从许多二维图像生成点云

c++ - 当不在包含路径中时,Eclipse CDT 自动引入/usr/include/boost

c++ - 如何删除错误 : pcl/memory. h : No such file or directory while building c++ file?

c++ - Cuda 三重嵌套 for 循环赋值

c++ - STL字符串比较方法与手动编写的方法之间存在巨大的时间差异

opencv - 使用 Kinect 进行物体识别

c++ - 这个预定义函数降低了我程序的性能

c++ - 为什么这段代码会泄露?

c++ - 在 C++ 中,如何在不通过参数传递对象的情况下重载运算符?

c++ - 如何从 vector 或数组中选择最常见的数字?(TOP5 toplist) C++