pcl实战实例代码c++
时间: 2024-11-13 11:39:29 浏览: 4
pcl点云图像旋转c++代码
在PCL中进行实际项目开发时,常见的任务包括点云滤波、分割、配准、特征提取等。这里给出一个简单的例子,演示如何使用PCL加载点云,然后进行滤波操作:
```cpp
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/passthrough.h>
int main()
{
// 1. 加载点云文件
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
if (pcl::io::loadPCDFile<pcl::PointXYZ>("input_cloud.pcd", *cloud) == -1)
{
PCL_ERROR("Failed to load the PCD file!\n");
return (-1);
}
// 2. 创建滤波器对象
pcl::PassthroughFilter<pcl::PointXYZ> pass;
// 3. 设置滤波器阈值(例如,只保留高度在0到1米之间的点)
pcl::PointIndices indices;
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);
std_msgs::Header header; // ROS Header,如果你正在使用ROS,则需要这个
double z_min = 0.0, z_max = 1.0;
pass.setInputCloud(cloud);
pass.setFilterFieldName("z"); // 设定我们要过滤的字段(这里是Z轴高度)
pass.setFilterLimits(z_min, z_max);
// 4. 应用滤波
pass.filter(indices);
// 5. 保存结果
pcl::PointCloud<pcl::PointXYZ>::Ptr filtered_cloud(new pcl::PointCloud<pcl::PointXYZ>);
for (std::size_t i = 0; i < indices.indices.size(); ++i)
{
const auto &idx = indices.indices[i];
filtered_cloud->points.push_back(cloud->points[idx]);
}
if (!pcl::io::savePCDFile("filtered_cloud.pcd", *filtered_cloud, header))
{
PCL_ERROR("Failed to save the filtered PCD file!\n");
}
PCL_INFO("Filtering completed successfully.\n");
return (0);
}
```
这个例子首先加载了一个点云文件,然后通过`PassthroughFilter`类设置了Z轴高度的滤波条件,仅保留高度在0到1米范围内的点。最后将过滤后的点云保存到一个新的PCD文件中。
阅读全文