博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
估计点云中的表面法线
阅读量:5007 次
发布时间:2019-06-12

本文共 2945 字,大约阅读时间需要 9 分钟。

翻译自:

线是几何表面的重要属性,并且在诸如计算机图形应用的许多领域中被大量使用,以应用产生阴影和其他视觉效果的正确光源。

给定几何表面,通常在表面上的某个点处推断法线的方向作为垂直于该点的表面的向量通常是繁琐的。 但是,由于我们获取了代表真实表面点云数据集上的一组点样本,因此有两种方法:

  使用表面网格划分技术从获取的点云数据集中获取下伏曲面,然后从网格中计算曲面法线;

  使用近似值直接从点云数据集推断出曲面法线。
本教程将针对后者,即给定点云数据集,直接计算云中每个点的曲面法线。

 

理论基础

虽然存在许多不同的常规估计方法,但我们将专注于本教程的方法是最简单的方法之一,其公式如下。 确定表面上的点的法线的问题可以近似转化成估计与表面相切的平面的法线的问题,这又成为最小二乘平面拟合估计问题。

因此,用于估计表面法线的解决方案被简化为对从查询点的最近邻居创建的协方差矩阵的特征向量和特征值(或PCA-主成分分析)的分析。 更具体地,对于每个点 ,我们如下组装协方差矩阵

其中k是在  的邻域中考虑的点邻居的数量, 表示最近邻居的3D质心, 是协方差矩阵的第j个特征值,并且 是第j个本征向量。

要从PCL中的一组点估计协方差矩阵,您可以使用:

// Placeholder for the 3x3 covariance matrix at each surface patch  Eigen::Matrix3f covariance_matrix;  // 16-bytes aligned placeholder for the XYZ centroid of a surface patch  Eigen::Vector4f xyz_centroid;  // Estimate the XYZ centroid  compute3DCentroid (cloud, xyz_centroid);  // Compute the 3x3 covariance matrix  computeCovarianceMatrix (cloud, xyz_centroid, covariance_matrix);

 

估计法线:

#include 
#include
{ pcl::PointCloud
::Ptr cloud (new pcl::PointCloud
); ... read, pass in or create a point cloud ... // Create the normal estimation class, and pass the input dataset to it pcl::NormalEstimation
ne; ne.setInputCloud (cloud); // Create an empty kdtree representation, and pass it to the normal estimation object. // Its content will be filled inside the object, based on the given input dataset (as no other search surface is given). pcl::search::KdTree
::Ptr tree (new pcl::search::KdTree
()); ne.setSearchMethod (tree); // Output datasets pcl::PointCloud
::Ptr cloud_normals (new pcl::PointCloud
); // Use all neighbors in a sphere of radius 3cm ne.setRadiusSearch (0.03); // Compute the features ne.compute (*cloud_normals); // cloud_normals->points.size () should have the same size as the input cloud->points.size ()*}

 

如果您的数据集是有组织的(例如,使用TOF相机,立体相机等获取 - 也就是说,它具有宽度和高度),为了获得更快的结果,可以使用积分图像来估计法线。

 

利用积分图像估计法线,代码如下:(用 VS2015 pro 运行时出现报错,显示为内存出错。。。)

#include 
#include
#include
#include
int main () { // load point cloud pcl::PointCloud
::Ptr cloud (new pcl::PointCloud
); pcl::io::loadPCDFile ("table_scene_mug_stereo_textured.pcd", *cloud); // estimate normals pcl::PointCloud
::Ptr normals (new pcl::PointCloud
); pcl::IntegralImageNormalEstimation
ne; ne.setNormalEstimationMethod (ne.AVERAGE_3D_GRADIENT); ne.setMaxDepthChangeFactor(0.02f); ne.setNormalSmoothingSize(10.0f); ne.setInputCloud(cloud); ne.compute(*normals); // visualize normals pcl::visualization::PCLVisualizer viewer("PCL Viewer"); viewer.setBackgroundColor (0.0, 0.0, 0.5); viewer.addPointCloudNormals
(cloud, normals); while (!viewer.wasStopped ()) { viewer.spinOnce (); } return 0; }

 

转载于:https://www.cnblogs.com/2Bthebest1/p/10917952.html

你可能感兴趣的文章
Codeforces Round #344 (Div. 2) Messager KMP的应用
查看>>
20145308刘昊阳 《Java程序设计》第4周学习总结
查看>>
js倒计时
查看>>
EasyUI datagrid 格式 二
查看>>
Android虹软人脸识别sdk使用工具类
查看>>
UI:基础
查看>>
浅谈 @RequestParam 和@PathVariable
查看>>
设计模式之---装饰器设计模式
查看>>
基于WordNet的英文同义词、近义词相似度评估及代码实现
查看>>
Equation漏洞混淆利用分析总结(上)
查看>>
shell学习1shell简介
查看>>
Qt 【无法打开 xxxx头文件】
查看>>
JAVA项目将 Oracle 转 MySQL 数据库转换(Hibernate 持久层)
查看>>
三层架构(我的理解及详细分析)
查看>>
Django模板语言相关内容
查看>>
前端开发工程师如何在2013年里提升自己【转】--2016已更新升级很多何去何从?...
查看>>
markdown语法测试集合
查看>>
running and coding
查看>>
实现QQ第三方登录、网站接入
查看>>
HTML CSS 层叠样式表 三
查看>>