我有两个点云,我想在同一个窗口中显示它们。
#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::runOnVisualizationThreadpcl::visualization::PCLVisualizer
的所有部分,并将其传递给 CloudViewer::runOnVisualizationThreadOnce
或 CloudViewer::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/