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

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

平面的法线是垂直于它的单位向量。在点云的表面的法线被定义为垂直于与点云表面相切的平面的向量。表面法线也可以计算点云中一点的法线,被认为是一种十分重要的性质。常常在被使用在很多计算机视觉的应用里面,比如可以用来推出光源的位置,通过阴影与其他视觉影响,表面法线的问题可以近似化解为切面的问题,这个切面的问题又会变成最小二乘法拟合平面的问题

解决表面法线估计的问题可以最终化简为对一个协方差矩阵的特征向量和特征值的分析(或者也叫PCA-Principal Component Analysis 主成分分析),这个协方差矩阵是由查询点的最近邻产生的。对于每个点Pi,我们假设协方差矩阵C如下:

法线提供了关于曲面的曲率信息,这是它的优势。许多的PCL的算法需要我们提供输入点云的法线。为了估计它们,代码分析如下

#include 
#include
#include
#include
int main(int argc,char**argv){//创建点云对象pcl::PointCloud
::Ptr cloud(new pcl::PointCloud
);//创建法线的对象pcl::PointCloud
::Ptr normals(new pcl::PointCloud
);//读取PCD文件if(pcl::io::loadPCDFile
(argv[1],*cloud) !=0){ return -1;}//创建法线估计的对象pcl::NormalEstimation
normalEstimation;normalEstimation.setInputCloud(cloud);//对于每一个点都用半径为3cm的近邻搜索方式normalEstimation.setRadiusSearch(0.03);//Kd_tree是一种数据结构便于管理点云以及搜索点云,法线估计对象会使用这种结构来找到哦啊最近邻点pcl::search::KdTree
::Ptr kdtree(new pcl::search::KdTree
);normalEstimation.setSearchMethod(kdtree);//计算法线normalEstimation.compute(*normals);//可视化boost::shared_ptr
viewer(new pcl::visualization::PCLVisualizer("Normals"));viewer->addPointCloud
(cloud,"cloud");while(!viewer->wasStopped()) { viewer->spinOnce(100);boost::this_thread::sleep(boost::posix_time::microseconds(1000000)); }}

试验结果就是运行命令,这里就随便输入一个PCD 文件

可能看不处什么效果*********************

(2)图像积分

积分图像是对有序点云的发现的估计的一种方法。该算法把点云作为一个深度图像,并创建一定的矩形区域来计算法线,考虑到相邻像素关系,而无需建立树形查询结构。因此,它是非常有效的。

#include 
#include
#include
#include
intmain(int argc, char** argv){ // 点云数据对象 pcl::PointCloud
::Ptr cloud(new pcl::PointCloud
); // 法线对象 pcl::PointCloud
::Ptr normals(new pcl::PointCloud
); // 读取文件 if (pcl::io::loadPCDFile
(argv[1], *cloud) != 0) { return -1; } // 法线估计对象 pcl::IntegralImageNormalEstimation
normalEstimation; normalEstimation.setInputCloud(cloud); // 法线估计方法: COVARIANCE_MATRIX, AVERAGE_DEPTH_CHANGE, SIMPLE_3D_GRADIENT. normalEstimation.setNormalEstimationMethod(normalEstimation.AVERAGE_3D_GRADIENT); //设置深度变化的阀值 normalEstimation.setMaxDepthChangeFactor(0.02f); // 设置计算法线的区域 normalEstimation.setNormalSmoothingSize(10.0f); // 计算 normalEstimation.compute(*normals); // 可视化 boost::shared_ptr
viewer(new pcl::visualization::PCLVisualizer("Normals")); viewer->addPointCloud
(cloud, "cloud"); viewer->addPointCloudNormals
(cloud, normals, 20, 0.03, "normals"); while (!viewer->wasStopped()) { viewer->spinOnce(100); boost::this_thread::sleep(boost::posix_time::microseconds(100000)); }}

结果可视化

具体官方的网址查看pointclouds.org/documentation/tutorials/normal_estimation_using_integral_images.php

 大神请忽略!!!!

微信公众号号可扫描二维码一起共同学习交流

转载于:https://www.cnblogs.com/li-yao7758258/p/6523419.html

你可能感兴趣的文章
修复IE不能执行JS的方法
查看>>
程序员究竟该如何提高效率zt
查看>>
希尔排序法(缩小增量法)
查看>>
PHP编程基础学习(一)——数据类型
查看>>
MongoDB-JAVA-Driver 3.2版本常用代码全整理(2) - 查询
查看>>
NPOI处理Word文本中上下角标
查看>>
Android笔记 Handler
查看>>
如何阅读大型前端开源项目的源码(转)
查看>>
java.util.Arrays类详解
查看>>
NYOJ-626-intersection set(二分查找)
查看>>
项目管理之路(1):初步踏入项目管理
查看>>
Java 中 静态方法与非静态方法的区别
查看>>
echarts饼图显示百分比
查看>>
JMS消息
查看>>
Jenkins+ProGet+Windows Batch搭建全自动的内部包(NuGet)打包和推送及管理平台
查看>>
php上传文件及头像预览
查看>>
大四java实习生的一些经历
查看>>
线程池的概念
查看>>
Oracle_Statspack性能诊断工具
查看>>
Java 序列化
查看>>