PCL 删除分段下的点 table
PCL remove points under a segmented table
我想删除已识别table下的所有点。我应该怎么做?
我有以下功能代码 segment/remove 来自点云的 table:
std::cout << "(II) segmenting table plane ..." << std::endl;
pcl::PointCloud<pcl::PointXYZ>::Ptr segmented_scene(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointIndices::Ptr inliers(new pcl::PointIndices());
ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients);
SACSegmentation<PointXYZ> segmentation;
segmentation.setInputCloud(downsampledScene);
segmentation.setModelType(pcl::SACMODEL_PLANE);
segmentation.setMethodType(pcl::SAC_RANSAC);
segmentation.setDistanceThreshold(threshold);
segmentation.setOptimizeCoefficients(true);
segmentation.setMaxIterations(1000);
//PointIndices inlierIndices;
segmentation.segment(*inliers, *coefficients);
ExtractIndices<PointXYZ> extract;
extract.setInputCloud(downsampledScene);
extract.setIndices(inliers);
extract.setNegative(true);
extract.filter(*segmented_scene);
//copyPointCloud<pcl::PointXYZ>(*downsampledScene, inlierIndices, *segmented_scene);
copyPointCloud(*segmented_scene, *outputCloud);
或者如何在table上设置坐标系的原点,使用passthrough filter过滤掉table下的所有点?
我用下面的代码对此进行了测试,但我认为这是不正确的:
Eigen::Affine3f transform_1 = Eigen::Affine3f::Identity();
cout << coefficients->values[0] << " " << coefficients->values[1] << " " << coefficients->values[2] << endl;
transform_1.translation() << coefficients->values[0], coefficients->values[1], coefficients->values[2];
transformPointCloud(*segmented_scene, *segmented_scene, transform_1);
最简单的方法可能是在您提取的平面点周围创建一个凸包,然后向下投影以在该凸包下方创建一个棱镜,移除该棱镜内的点。使用 pcl::ExtractPolygonalPrismData class.
点云库可以轻松完成此操作
可以找到使用此 class 的教程 here。
我是这样解决问题的:
创建 Eigen::Vector3d n 个系数 (0,1,2)。
计算Vector与z轴的夹角。
如果角度 > 0,则反转 n,coefficients.value(3) 和角度,因为 z 过滤器限制 [setFilterLimits(FLT_MIN,FLT_MAX); ]
创建 Eigen::Affine3d t (Eigen::Translation3d(n*coefficients.values(3)));
计算 r AngelAxisd(angle,axis)
计算变换 r * t
变换点云
使用直通过滤器并设置限制。
然后逆变换
我想删除已识别table下的所有点。我应该怎么做? 我有以下功能代码 segment/remove 来自点云的 table:
std::cout << "(II) segmenting table plane ..." << std::endl;
pcl::PointCloud<pcl::PointXYZ>::Ptr segmented_scene(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointIndices::Ptr inliers(new pcl::PointIndices());
ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients);
SACSegmentation<PointXYZ> segmentation;
segmentation.setInputCloud(downsampledScene);
segmentation.setModelType(pcl::SACMODEL_PLANE);
segmentation.setMethodType(pcl::SAC_RANSAC);
segmentation.setDistanceThreshold(threshold);
segmentation.setOptimizeCoefficients(true);
segmentation.setMaxIterations(1000);
//PointIndices inlierIndices;
segmentation.segment(*inliers, *coefficients);
ExtractIndices<PointXYZ> extract;
extract.setInputCloud(downsampledScene);
extract.setIndices(inliers);
extract.setNegative(true);
extract.filter(*segmented_scene);
//copyPointCloud<pcl::PointXYZ>(*downsampledScene, inlierIndices, *segmented_scene);
copyPointCloud(*segmented_scene, *outputCloud);
或者如何在table上设置坐标系的原点,使用passthrough filter过滤掉table下的所有点?
我用下面的代码对此进行了测试,但我认为这是不正确的:
Eigen::Affine3f transform_1 = Eigen::Affine3f::Identity();
cout << coefficients->values[0] << " " << coefficients->values[1] << " " << coefficients->values[2] << endl;
transform_1.translation() << coefficients->values[0], coefficients->values[1], coefficients->values[2];
transformPointCloud(*segmented_scene, *segmented_scene, transform_1);
最简单的方法可能是在您提取的平面点周围创建一个凸包,然后向下投影以在该凸包下方创建一个棱镜,移除该棱镜内的点。使用 pcl::ExtractPolygonalPrismData class.
点云库可以轻松完成此操作可以找到使用此 class 的教程 here。
我是这样解决问题的:
创建 Eigen::Vector3d n 个系数 (0,1,2)。
计算Vector与z轴的夹角。
如果角度 > 0,则反转 n,coefficients.value(3) 和角度,因为 z 过滤器限制 [setFilterLimits(FLT_MIN,FLT_MAX); ]
创建 Eigen::Affine3d t (Eigen::Translation3d(n*coefficients.values(3)));
计算 r AngelAxisd(angle,axis)
计算变换 r * t
变换点云
使用直通过滤器并设置限制。
然后逆变换