PCL学习笔记——NormalEstimation估计点云的法向量
主要Classes:
pcl::NormalEstimation< PointInT, PointOutT > Class
头文件:
#include <pcl/features/normal_3d.h>
Code:
// overlapped_points_normal_estimation.cpp: 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
#include<fstream>
#include<pcl/io/pcd_io.h>
#include<pcl/point_types.h>
#include<pcl/point_cloud.h>
#include<pcl/kdtree/kdtree_flann.h>
#include<pcl/kdtree/io.h>
#include<vector>
#include<pcl/features/normal_3d.h>
using namespace std;
int main()
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloudA(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ>::Ptr cloudB(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ>::Ptr overlapA(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ>::Ptr overlapB(new pcl::PointCloud<pcl::PointXYZ>);
if (pcl::io::loadPCDFile<pcl::PointXYZ>("pointA.pcd", *cloudA) == -1)
{
PCL_ERROR("Couldn't read the pointA.pcd\n");
return -1;
}
if (pcl::io::loadPCDFile<pcl::PointXYZ>("pointB.pcd", *cloudB) == -1)
{
PCL_ERROR("Couldn't read the pointB.pcd\n");
return -1;
}
if (pcl::io::loadPCDFile<pcl::PointXYZ>("overlapA.pcd", *overlapA) == -1)
{
PCL_ERROR("Couldn't read the pointB.pcd\n");
return -1;
}
if (pcl::io::loadPCDFile<pcl::PointXYZ>("overlapB.pcd", *overlapB) == -1)
{
PCL_ERROR("Couldn't read the pointB.pcd\n");
return -1;
}
//创建法线估计对象,并将输入数据集传递给这个对象
pcl::NormalEstimation<pcl::PointXYZ,pcl::Normal>ne1;
pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal>ne2;
ne1.setInputCloud(overlapA);
ne1.setSearchSurface(cloudA);
ne2.setInputCloud(overlapB);
ne2.setSearchSurface(cloudB);
//以kdtree作为索引方式
pcl::search::KdTree<pcl::PointXYZ>::Ptr treeA(new pcl::search::KdTree<pcl::PointXYZ>);
pcl::search::KdTree<pcl::PointXYZ>::Ptr treeB(new pcl::search::KdTree<pcl::PointXYZ>);
ne1.setSearchMethod(treeA);
ne1.setSearchMethod(treeB);
//存储输出数据集
pcl::PointCloud<pcl::Normal>::Ptr overlapA_normals(new pcl::PointCloud<pcl::Normal>);
pcl::PointCloud<pcl::Normal>::Ptr overlapB_normals(new pcl::PointCloud<pcl::Normal>);
ne1.setRadiusSearch(0.4);
ne2.setRadiusSearch(0.4);
ne1.compute(*overlapA_normals);
ne2.compute(*overlapB_normals);
pcl::io::savePCDFileASCII("overlapA_normals.pcd", *overlapA_normals);
pcl::io::savePCDFileASCII("overlapB_normals.pcd", *overlapB_normals);
return 0;
}