专栏首页点云PCLPCL法线估计

PCL法线估计

平面的法线是垂直于它的单位向量。在点云的表面的法线被定义为垂直于与点云表面相切的平面的向量。表面法线也可以计算点云中一点的法线,被认为是一种十分重要的性质。 法线提供了关于曲面的曲率信息,这是它的优势。许多的PCL的算法需要我们提供输入点云的法线。为了估计它们,代码分析如下

#include <pcl/io/pcd_io.h>
#include <pcl/features/normal_3d.h>
#include <boost/thread/thread.hpp>
#include <pcl/visualization/pcl_visualizer.h>

int main(int argc,char**argv)
{//创建点云对象
pcl::PointCloud<pcl::PointXYZ>::Ptr  cloud(new pcl::PointCloud<pcl::PointXYZ>);
//创建法线的对象
pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);
//读取PCD文件
if(pcl::io::loadPCDFile<pcl::PointXYZ>(argv[1],*cloud) !=0)
{ 
return -1;
}
//创建法线估计的对象
pcl::NormalEstimation<pcl::PointXYZ,pcl::Normal> normalEstimation;
normalEstimation.setInputCloud(cloud);//对于每一个点都用半径为3cm的近邻搜索方式normalEstimation.setRadiusSearch(0.03);

//Kd_tree是一种数据结构便于管理点云以及搜索点云,法线估计对象会使用这种结构来找到最近邻点pcl::search::KdTree<pcl::PointXYZ>::Ptr kdtree(new pcl::search::KdTree<pcl::PointXYZ>);normalEstimation.setSearchMethod(kdtree);//计算法线normalEstimation.compute(*normals);
//可视化
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("Normals"));
viewer->addPointCloud<pcl::PointXYZ>(cloud,"cloud");while(!viewer->wasStopped())
 {
viewer->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(1000000));
}
}

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

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

(2)图像积分

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

#include <pcl/io/pcd_io.h>
#include <pcl/features/integral_image_normal.h>
#include <boost/thread/thread.hpp>
#include <pcl/visualization/pcl_visualizer.h>

int main(int argc, char** argv)
{    // 点云数据对象
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);    // 法线对象pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);    // 读取文件if (pcl::io::loadPCDFile<pcl::PointXYZ>(argv[1], *cloud) != 0)
   {      
  return -1;
   }    

// 法线估计对象pcl::IntegralImageNormalEstimation<pcl::PointXYZ, pcl::Normal> 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<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("Normals"));
   viewer->addPointCloud<pcl::PointXYZ>(cloud, "cloud");   viewer->addPointCloudNormals<pcl::PointXYZ, pcl::Normal>(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

大神请忽略!!!!

本文分享自微信公众号 - 点云PCL(dianyunPCL),作者:石城大海

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • PCL几种采样方法

    一般下采样是通过构造一个三维体素栅格,然后在每个体素内用体素内的所有点的重心近似显示体素中的其他点,这样体素内所有点就用一个重心点来表示,进行下采样的来达到滤波...

    点云PCL博主
  • PCL点云曲面重建(1)

    在测量较小的数据时会产生一些误差,这些误差所造成的不规则数据如果直接拿来曲面重建的话,会使得重建的曲面不光滑或者有漏洞,可以采用对数据重采样来解决这样问题,通过...

    点云PCL博主
  • PCL中点云数据格式之间的转化

    关于pcl::PCLPointCloud2::Ptr和pcl::PointCloud<pcl::PointXYZ>两中数据结构的区别

    点云PCL博主
  • PCL几种采样方法

    一般下采样是通过构造一个三维体素栅格,然后在每个体素内用体素内的所有点的重心近似显示体素中的其他点,这样体素内所有点就用一个重心点来表示,进行下采样的来达到滤波...

    点云PCL博主
  • PCL点云曲面重建(1)

    在测量较小的数据时会产生一些误差,这些误差所造成的不规则数据如果直接拿来曲面重建的话,会使得重建的曲面不光滑或者有漏洞,可以采用对数据重采样来解决这样问题,通过...

    点云PCL博主
  • Learning ROS for Robotics Programming Second Edition学习笔记(七) indigo PCL xtion pro live

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865

    zhangrelay
  • PCL中点云数据格式之间的转化

    关于pcl::PCLPointCloud2::Ptr和pcl::PointCloud<pcl::PointXYZ>两中数据结构的区别

    点云PCL博主
  • 如何在ROS中使用PCL—数据格式(1)

    关于PCL在ros的数据的结构,具体的介绍可查 看 wiki.ros.org/pcl/Overview

    点云PCL博主
  • PCL-1.8.0安装与配置问题(2)

    我用别人的例子说明,首先需要点云数据,pcd格式的,本文用麦子的点云文件,放在工程自己创建的“my”工程文件下,默认文件在工程文件C:\visual studi...

    点云PCL博主
  • 久违的小分享(2)

    PCL中进行点云去噪的方法比较多,其中一种基于统计学的方法比较新颖,其函数为StatisticalOutlierRemoval。其原理是将输入数据中每个点到临近...

    点云PCL博主

扫码关注云+社区

领取腾讯云代金券