在 C++ 中使用 PCL 查看同一 window 中的多个点云
View multiple Point Clouds in same window using PCL in C++
我有两个点云,我想在同一个中可视化它们 window。
#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 工具,因为我需要对此数据进行一些其他处理。
根据the pcl documentation,您可以为显示点云提供一个名称。
如果您提供相同的名称,它将覆盖现有的云。
这基本上意味着更改以下调用:
viewer.showCloud (body);
viewer.showCloud (head);
与:
viewer.showCloud (body, "body");
viewer.showCloud (head, "head");
当然你可以使用任何你想要的名字。
关于评论
"Okay. I will check it soon. Can you tell me to set camera parameters and background color using 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::CloudViewer::runOnVisualizationThread
函数的 pcl::visualization::PCLVisualizer
的任何函数。为此,您需要创建一个函数来完成所有使用 pcl::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
会好很多。
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");
我有两个点云,我想在同一个中可视化它们 window。
#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 工具,因为我需要对此数据进行一些其他处理。
根据the pcl documentation,您可以为显示点云提供一个名称。
如果您提供相同的名称,它将覆盖现有的云。
这基本上意味着更改以下调用:
viewer.showCloud (body);
viewer.showCloud (head);
与:
viewer.showCloud (body, "body");
viewer.showCloud (head, "head");
当然你可以使用任何你想要的名字。
关于评论
"Okay. I will check it soon. Can you tell me to set camera parameters and background color using 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::CloudViewer::runOnVisualizationThread
函数的 pcl::visualization::PCLVisualizer
的任何函数。为此,您需要创建一个函数来完成所有使用 pcl::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
会好很多。
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");