【SLAM】PCL:通过条件设置或者半径设置去除指定点云

发布时间:2026/10/22 12:10:52
【SLAM】PCL:通过条件设置或者半径设置去除指定点云
#include iostream #include pcl/point_types.h #include pcl/filters/radius_outlier_removal.h #include pcl/filters/conditional_removal.h #include pcl/io/pcd_io.h int main(int argc, char **argv) { //初始化点云 pcl::PointCloudpcl::PointXYZ::Ptr cloud (new pcl::PointCloudpcl::PointXYZ); pcl::PointCloudpcl::PointXYZ::Ptr cloud_filtered (new pcl::PointCloudpcl::PointXYZ); pcl::PCDWriter writer; //设置点云为500个也可以自行修改或者直接读取PCD文件 cloud-width 500; cloud-height 1; 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); } writer.writepcl::PointXYZ(./original.pcd, *cloud, false); if (strcmp(argv[1], -r) 0){ pcl::RadiusOutlierRemovalpcl::PointXYZ outrem; // build the filter outrem.setInputCloud(cloud); //设置搜索半径为0.3 outrem.setRadiusSearch(0.3); //在该半径中必须最少有5个邻点则保持在点云中 outrem.setMinNeighborsInRadius (5); // apply filter outrem.filter (*cloud_filtered); writer.writepcl::PointXYZ(./points_outrem.pcd, *cloud_filtered, false); } else if (strcmp(argv[1], -c) 0) { pcl::ConditionAndpcl::PointXYZ::Ptr range_cloud(new pcl::ConditionAndpcl::PointXYZ ()); //设置作用域为z取大于0且小于0.8的位置保留在点云中其余进行移除 range_cloud-addComparison(pcl::FieldComparisonpcl::PointXYZ::ConstPtr (new pcl::FieldComparisonpcl::PointXYZ(z, pcl::ComparisonOps::GT, 0.0))); range_cloud-addComparison(pcl::FieldComparisonpcl::PointXYZ::ConstPtr (new pcl::FieldComparisonpcl::PointXYZ(z, pcl::ComparisonOps::LT, 0.8))); pcl::ConditionalRemovalpcl::PointXYZ condream; condream.setCondition(range_cloud); condream.setInputCloud(cloud); condream.setKeepOrganized(true); condream.filter(*cloud_filtered); writer.writepcl::PointXYZ(./points_condream.pcd, *cloud_filtered, false); } else{ std::cerr please specify command line arg -r or -c std::endl; exit(0); } return 0; }通过设置半径蓝色点为去除的点因为只能放平面图立体图可以看出删除的点主要都在表面通过设置z的范围绿色是保留的点云 橙色的点云是删除的点云