C++ 复制PCL点云,同时保留组织或Ransac+;曲面法线计算

C++ 复制PCL点云,同时保留组织或Ransac+;曲面法线计算,c++,kinect,point-cloud-library,openkinect,C++,Kinect,Point Cloud Library,Openkinect,我有一个点云 pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGBA>); pcl::PointCloud::Ptr cloud(新的pcl::PointCloud); 我想复制到 pcl::PointCloud<pcl::PointXYZRGBA>::Ptr finalcloud (new pcl::PointCloud<pcl::Po

我有一个点云

pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGBA>);
pcl::PointCloud::Ptr cloud(新的pcl::PointCloud);
我想复制到

pcl::PointCloud<pcl::PointXYZRGBA>::Ptr finalcloud (new pcl::PointCloud<pcl::PointXYZRGBA>);
pcl::PointCloud::Ptr finalcloud(新pcl::PointCloud);
而基于使用ransac计算的一些内联线进行过滤

std::vector<int> inliers;
std::向量内联器;
我目前正在做这件事

pcl::copyPointCloud<pcl::PointXYZRGBA>(*cloud, inliers, *finalcloud);
pcl::copyPointCloud(*云,内联,*finalcloud);
问题

因为我想找到这个云的法线,所以我需要维护组织。copyPointCloud函数使新的点云高度为1(请参见的第188行)


在pcl上执行ransac后,有人能够找到正常值吗?

我认为这个答案太晚了,API可能会从2015年起发生变化。。但我会回答的

正常估计将适用于有组织云和无组织云

无组织云 我正在从中复制代码 在这段代码中,KdTree将用于估计邻居

#包括
#包括
{
pcl::PointCloud::Ptr cloud(新的pcl::PointCloud);
…读取、传入或创建点云。。。
//创建normal estimation类,并将输入数据集传递给它
pcl::正态估计;
ne.setInputCloud(云);
//创建一个空的kdtree表示,并将其传递给normal estimation对象。
//它的内容将基于给定的输入数据集填充到对象内部(因为没有给出其他搜索曲面)。
pcl::search::KdTree::Ptr树(新的pcl::search::KdTree());
ne.setSearchMethod(树);
//输出数据集
pcl::PointCloud::Ptr cloud_法线(新pcl::PointCloud);
//使用半径为3cm的球体中的所有邻居
ne.setRadiusSearch(0.03);
//计算特征
ne.compute(*云法线);
//cloud\u normals->points.size()的大小应与输入cloud->points.size()的大小相同*
}
有序云 我正在从中复制代码

//加载点云
pcl::PointCloud::Ptr cloud(新的pcl::PointCloud);
pcl::io::loadPCDFile(“桌子、场景、杯子、立体、纹理.pcd”,*云);
//估计法线
pcl::PointCloud::Ptr法线(新pcl::PointCloud);
pcl::积分图像归一化估计;
ne.SetNormal估计方法(ne.AVERAGE\u 3D\u GRADIENT);
ne.setMaxDepthChangeFactor(0.02f);
ne.设置NormalSmoothingSize(10.0f);
ne.setInputCloud(云);
ne.计算(*法线);

我不确定,但并非所有程序(用于正常估计)都需要有组织的点云。@Kornel这是我使用的教程,setInputCloud()函数需要有组织的点云。你确定吗?对有序/无序性质没有任何限制。只有OMP版本需要有组织的云。