pcl c++ 计算点云法向量 并利用removeNaNNormalsFromPointCloud()去除无效法向量 并可视化点云与法向量
时间: 2023-09-10 08:10:42 浏览: 258
以下是基于 PCL 1.10 的 C++ 代码示例,演示了如何计算点云法向量并去除无效法向量,并可视化点云与法向量。
```c++
#include <iostream>
#include <pcl/point_types.h>
#include <pcl/features/normal_3d.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/filters/filter.h>
int main(int argc, char** argv)
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
if (pcl::io::loadPCDFile<pcl::PointXYZ>("input_cloud.pcd", *cloud) == -1)
{
PCL_ERROR("Couldn't read file input_cloud.pcd \n");
return (-1);
}
// 计算点云法向量
pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;
ne.setInputCloud(cloud);
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);
ne.setSearchMethod(tree);
pcl::PointCloud<pcl::Normal>::Ptr cloud_normals(new pcl::PointCloud<pcl::Normal>);
ne.setKSearch(20);
ne.compute(*cloud_normals);
// 去除无效法向量
std::vector<int> indices;
pcl::removeNaNNormalsFromPointCloud(*cloud_normals, *cloud_normals, indices);
// 可视化点云与法向量
pcl::visualization::PCLVisualizer viewer("PointCloud with normals");
viewer.setBackgroundColor(0.0, 0.0, 0.0);
viewer.addPointCloud<pcl::PointXYZ>(cloud, "cloud");
viewer.addPointCloudNormals<pcl::PointXYZ, pcl::Normal>(cloud, cloud_normals, 10, 0.05, "normals");
viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "cloud");
viewer.spin();
return (0);
}
```
其中,`pcl::io::loadPCDFile` 用于读取点云文件,`pcl::NormalEstimation` 用于计算点云法向量,`pcl::removeNaNNormalsFromPointCloud` 用于去除无效法向量,`pcl::visualization::PCLVisualizer` 用于可视化点云与法向量。
需要注意的是,这里的代码假定点云文件是以 PCD 格式存储的,如果是其他格式需要相应调整代码。另外,计算法向量的方法是基于 K 近邻搜索的,`ne.setKSearch(20)` 中的参数 20 表示使用前 20 个最近邻点来计算法向量。这个参数可以调整以获得更好的效果。
阅读全文