PCL:可视化点云

lib*_*orw 11 point-clouds point-cloud-library

我正在尝试使用PCL CloudViewer 可视化点云.问题是,我是很新的C++,我发现两个教程第一示范点云的创建和第二示范一个点云的可视化.但是,我无法将这两个教程结合起来.

这就是我的意思:

#include <iostream>

#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/visualization/cloud_viewer.h>

int main (int argc, char** argv)
{
  pcl::PointCloud<pcl::PointXYZ> cloud;

  // Fill in the cloud data
  cloud.width    = 5;
  cloud.height   = 1;
  cloud.is_dense = false;
  cloud.points.resize (cloud.width * cloud.height);

  for (size_t i = 0; i < cloud.points.size (); ++i)
  {
    cloud.points[i].x = 1024 * rand () / (RAND_MAX + 1.0f);
    cloud.points[i].y = 1024 * rand () / (RAND_MAX + 1.0f);
    cloud.points[i].z = 1024 * rand () / (RAND_MAX + 1.0f);
  }

  pcl::visualization::CloudViewer viewer ("Simple Cloud Viewer");
  viewer.showCloud (cloud);

  while (!viewer.wasStopped ())
  {
  }

  return (0);
}
Run Code Online (Sandbox Code Playgroud)

但即使不编译:

error: no matching function for call to   
‘pcl::visualization::CloudViewer::showCloud(pcl::PointCloud<pcl::PointXYZ>&)’
Run Code Online (Sandbox Code Playgroud)

ahc*_*cox 10

您的错误消息告诉您需要执行的操作:

error: no matching function for call to ‘pcl::visualization::CloudViewer::showCloud(pcl::PointCloud<pcl::PointXYZ>&)’
Run Code Online (Sandbox Code Playgroud)

因此,请转到CloudViewer的文档,并查看此成员函数采用的参数:http://docs.pointclouds.org/1.5.1/classpcl_1_1visualization_1_1_cloud_viewer.html

在那里我们看到它const MonochromeCloud::ConstPtr &cloud不需要传入的原始引用.这是来自boost的智能指针的typedef:

typedef boost::shared_ptr<const PointCloud<PointT> > pcl::PointCloud< PointT >::ConstPtr
Run Code Online (Sandbox Code Playgroud)

因此,当您创建云时,您需要将其包装在其中一个智能指针中,而不是将其作为局部变量.像(未经测试)的东西:

pcl::MonochromeCloud::ConstPtr cloud(new pcl::PointCloud<pcl::PointXYZ>());
Run Code Online (Sandbox Code Playgroud)

然后,当您传入变量云时,它将具有正确的类型,您将不会收到您报告的错误.您还必须将您的cloud.foos 更改为cloud->foos.

看看你给出的第二个例子,他们也是这样做的:

pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGBA>);
Run Code Online (Sandbox Code Playgroud)


Tim*_*man 7

立即给出答案:

pcl::PointCloud<pcl::PointXYZRGB>::Ptr ptrCloud(&cloud);
Run Code Online (Sandbox Code Playgroud)

然后在观众中放入ptrCloud,这就是它所期望的:

viewer.showCloud (ptrCloud);
Run Code Online (Sandbox Code Playgroud)