在C++中使用 PCL 在同一窗口中查看多个点云
View multiple Point Clouds in same window using PCL in C++
我有两个点云,我想在同一个窗口中可视化。
#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工具,因为我需要对这些数据进行其他处理。
关于评论
"好的。我很快就会检查一下。你能告诉我使用 API 设置相机参数和背景颜色cloud_viewer吗?
我不是 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;
}
编辑这绝对是一种做到这一点的方法。通过查看此处,您可以看到您可以使用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
要好得多。
根据 pcl 文档,您可以为显示点云提供一个名称。
如果提供相同的名称,则会覆盖现有云。
这基本上意味着更改以下调用:
viewer.showCloud (body);
viewer.showCloud (head);
跟:
viewer.showCloud (body, "body");
viewer.showCloud (head, "head");
当然,您可以使用任何您想要的名称。
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");
- 如何获取pcl迭代最近点(ICP)的迭代点数?
- 将 PCL 链接到 Cython C++ 模块
- PCL:当我在setConditionFunction中使用std::bind 时,没有合适的转换函数
- PCL octree std::bad_alloc c++
- 在点云库 (PCL) 中使用自定义点类型的问题
- PCL 出错:体系结构x86_64 @pcl的未定义符号
- PCL:将两个点云缩放到相同的大小
- 在同一项目中使用 CGAL 和 PCL
- PCL 中的 GICP 用法
- 退出 PCL 查看器:即使窗口已关闭,wasStop() 也不会更改值
- 使用pcl transformcloud将三维点平移并旋转到原点
- 使用pcl库设置错误
- 如何在ROS中使用PCL可视化动力学数据的表面法线
- 增加 PCL 中点云的点大小以实现可视化
- 在C++中使用 PCL 在同一窗口中查看多个点云
- 删除 PCL 可视化工具中定义的 3D 框外部的点
- 在 PCL 可视化工具中打印所选点的 3D 坐标
- 从源代码构建 pcl 1.7.2
- 如何修改 PCL 体素网格实现?
- 点云库 (PCL) - 声明点云时何时应使用 ::P tr 的经验法则?