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;
}


Result:

PCL学习笔记——NormalEstimation估计点云的法向量