上一篇分享了如何在点云上生成直线点云,可以用来画坐标系和进行点云的筛选剔除。这篇文章用来介绍如何进行点云的分割剔除部分。
上一篇文章链接如下:
三维视觉--基于PCL的等距离点云直线生成(C++)实现-CSDN博客
本文的原理是已知三维空间一点和该点法向,我们可以根据这一信息生成直线点云并结合半径滤波,实现整体点云的筛选。当然,也可以结合其他方法,本文以半径滤波为例。
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudOut(new pcl::PointCloud<pcl::PointXYZRGB>);
//遍历整体点云和直线点云
for (size_t i = 0; i < cloud->points.size(); ++i) {
double distance = 0.0;
for (size_t j = 0; j < cloud_Line->points.size(); ++j) {
//对遍历的点,求三个轴上的距离
double dx = cloud_Line->points[j].x - cloud->points[i].x;
double dy = cloud_Line->points[j].y - cloud->points[i].y;
double dz = cloud_Line->points[j].z - cloud->points[i].z;
distance = std::sqrt(dx * dx + dy * dy + dz * dz);
//整体点云到直线点云的距离小于2的,保留
if (distance < 2.0) {
cloudOut->points.push_back(cloud->points[i]);
break;
}
}
}
pcl::io::savePLYFileBinary("cloudOut.ply", *cloudOut);
其中,直线点云的实现代码已经在上一篇给出,这里不做赘述。
这样就能实现将整体点云中,距离直线点云一定条件的点云保留或删除。当然,这样的用法还可以实现很多其他功能。
草稿代码可能不是很严谨,但运行起来问题不大。