在分割点云的时候,有时候很难去精准的去把自己想要的区域提取出来,有时用手动选择区域的时候还会多点或者少点,如果自己的点云文件中包含idensity属性,就可以使用idensity去区分不同的物体,前提是你要提取的物体的idensity和别的物体是不同的。
示例代码如下:
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/kdtree/kdtree.h>
#include <pcl/visualization/pcl_visualizer.h>
using namespace std;
int
main(int argc, char** argv)
{
// 从PCD文件中读取点云数据
pcl::PCDReader reader;
pcl::PointCloud<pcl::PointXYZI>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZI>);
pcl::PointCloud<pcl::PointXYZI>::Ptr cloud_filter(new pcl::PointCloud<pcl::PointXYZI>);
pcl::PointXYZI point_filter;
reader.read(argv[1], *cloud);
for(const auto& point : cloud->points){
if(point.intensity >=150){
cout<<"("<<point.x<<", "<<point.y<<","<<point.z<<")";
cout<<"intensity:"<<point.intensity<<endl;
point_filter.x = point.x;
point_filter.y = point.y;
point_filter.z = point.z;
point_filter.intensity = point.intensity;
cloud_filter->push_back(point_filter);
}
}
//设置一个窗口进行显示点云
pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
viewer->setBackgroundColor(0, 0, 0);
//red
pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZI> input1_color(cloud_filter, 0, 0, 255);
viewer->addPointCloud<pcl::PointXYZI>(cloud_filter, input1_color, "sample cloud1");
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud1");
viewer->spin();
while (!viewer->wasStopped())
{
}
std::cout << "PointCloud before filtering has: " << cloud->points.size() << " data points." << std::endl; //*
}