PCL学习笔记(9)——PCL计算点云法向量并可视化

7 篇文章 1 订阅

1、点云法向量(法线)估计
因此,用于估计表面法线的解决方案简化为对从查询点的最近邻居创建的协方差矩阵的特征向量和特征值(或 PCA – 主成分分析)进行分析。更具体地说,对于每个点Pi,我们按如下方式组装协方差矩阵:
在这里插入图片描述
凡K为考虑点邻居的数目在附近Pi,p表示3D质心最近的邻居,λj是 j协方差矩阵的特征值第,并且\vec{{\mathsf v}_j} 在j个特征向量。

#include <iostream>
#include <pcl\io\pcd_io.h>
#include <pcl\features\normal_3d.h>
#include <pcl\visualization\cloud_viewer.h>
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL);

using namespace std;

typedef pcl::PointXYZ PointT;

int main()
{
	//--------------------------- 加载点云 ---------------------------
	pcl::PointCloud<PointT>::Ptr cloud(new pcl::PointCloud<PointT>);
	if (pcl::io::loadPCDFile("table.pcd", *cloud) < 0)
	{
		PCL_ERROR("->点云文件不存在!\a\n");
		system("pause");
		return -1;
	}
	//===============================================================
	
	
	//--------------------------- 法线估计 ---------------------------
	pcl::NormalEstimation<PointT, pcl::Normal> ne;		//创建法线估计对象
	ne.setInputCloud(cloud);							//设置法线估计输入点云
	pcl::search::KdTree<PointT>::Ptr tree(new pcl::search::KdTree<PointT>());	//创建一个空的kdtree
	ne.setSearchMethod(tree);													//将空kdtree传递给法线估计对象 ne
	pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);//法向量计算结果
	ne.setKSearch(10);			//设置K近邻的个数
	//ne.setRadiusSearch(0.05);	//设置半径邻域的大小,两种方式二选一
	ne.setViewPoint(0, 0, 1);	//设置视点向量,默认0向量(0,0,0),没有方向
	ne.compute(*normals);		//执行法线估计,并将结果保存到normals中
	//===============================================================


	//-------------------------- 法线可视化 --------------------------
	boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer")); //创建视窗对象,定义标题栏名称“3D Viewer”
	viewer->addPointCloud<PointT>(cloud, "original_cloud");	//将点云添加到视窗对象中,并定义一个唯一的ID“original_cloud”
	viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 1, 0, 0.5, "original_cloud"); //点云附色,三个字段,每个字段范围0-1
	viewer->addPointCloudNormals<PointT, pcl::Normal>(cloud, normals, 10, 0.05, "normals");	//每十个点显示一个法线,长度为0.05

	while (!viewer->wasStopped())
	{
		viewer->spinOnce(100);
		boost::this_thread::sleep(boost::posix_time::microseconds(100000));
	}
	//===============================================================
	
	return 0;
}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
计算点云向量,可以使用PCL库。以下是一个简单的示例代码,演示如何读取pcd文件并计算pcd点云向量: ```cpp #include <pcl/io/pcd_io.h> #include <pcl/features/normal_3d.h> int main(int argc, char** argv) { // 读取pcd文件 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); pcl::io::loadPCDFile<pcl::PointXYZ>("input_cloud.pcd", *cloud); // 创建向量估计对象 pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne; ne.setInputCloud(cloud); // 创建一个kdtree对象,用于近邻搜索 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.setRadiusSearch(0.03); // 设置搜索半径 ne.compute(*cloud_normals); // 计算向量 // 将向量保存到文件中 pcl::io::savePCDFileASCII("output_normals.pcd", *cloud_normals); return 0; } ``` 在上面的示例代码中,我们使用`pcl::io::loadPCDFile`函数加载了一个名为`input_cloud.pcd`的点云文件。然后,我们创建了一个向量估计对象,并将输入点云设置为我们刚刚加载的点云。我们还创建了一个kdtree对象,用于近邻搜索。接下来,我们设置了搜索半径,并使用`ne.compute`函数计算点云向量。最后,我们使用`pcl::io::savePCDFileASCII`函数将向量保存到`output_normals.pcd`文件中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值