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:

在这里插入图片描述

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值