你好,我试图通过聚类法线从点点云来获得一些平面,所以我使用下面的代码,但似乎没有按照我想要的方式工作。 我几乎不知道关于PCL编程的任何事情,所以我怀疑的是,如果我想使用云,那么包含云的变量在哪里,并且为了显示法线是必要的,以便使用PCLVisualizer,但我尝试了一些东西而没有得到一个好结果。 那么你是否愿意提供一些建议来获得我需要的结果。 最诚挚的问候,谢谢。
#include <pcl/point_types.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/io/openni_grabber.h>
#include <pcl/sample_consensus/sac_model_plane.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/features/normal_3d.h>
using namespace std;
class SimpleOpenNIViewer
{
public:
pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;
SimpleOpenNIViewer () : viewer ("PCL OpenNI Viewer") {}
void cloud_cb_ (const pcl::PointCloud<pcl::PointXYZ>::ConstPtr &cloud)
{
if (!viewer.wasStopped())
{
ne.setInputCloud (cloud);
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ> ());
ne.setSearchMethod (tree);
pcl::PointCloud<pcl::Normal>::Ptr cloud_normals (new pcl::PointCloud<pcl::Normal>);
ne.setRadiusSearch (0.03);
ne.compute (*cloud_normals);
cout<<"Normales calculadas"<<endl;
viewer.showCloud (cloud);
}
}
void run ()
{
pcl::Grabber* interface = new pcl::OpenNIGrabber();
boost::function<void (const pcl::PointCloud<pcl::PointXYZ>::ConstPtr&)> f =
boost::bind (&SimpleOpenNIViewer::cloud_cb_, this, _1);
interface->registerCallback (f);
interface->start ();
while (!viewer.wasStopped())
{
boost::this_thread::sleep (boost::posix_time::seconds (1));
}
interface->stop ();
}
pcl::visualization::CloudViewer viewer;
};
int main ()
{
SimpleOpenNIViewer v;
v.run ();
return 0;
}
答案 0 :(得分:0)
我不确切知道你在做什么,但我猜你输入的云是无组织的点云。因此没有给出宽度和高度。在此示例中更改传感器的宽度和高度。
if (!viewer.wasStopped())
{
cloud->width = 640;
cloud->height = 480;
ne.setInputCloud (cloud);