点云法线估计:C++实现_c++ 点云法向量-程序员宅基地

技术标签: 算法  点云处理  计算机视觉  

一、理论基础

1、为什么要求点云的法线

表面法线是几何体表面的重要属性,在很多领域都有大量应用,例如:在进行光照渲染时产生符合可视习惯的效果时需要表面法线信息才能正常进行,对于一个已知的几何体表面,根据垂直于点表面的矢量,因此推断表面某一点的法线方向通常比较简单。然而,由于我们获取的点云数据集在真实物体的表面表现为一组定点样本,这样就会有两种解决方法:

1)使用曲面重建技术,从获取的点云数据集中得到采样点对应的曲面,然后从曲面模型中计算表面法线;

2)直接从点云数据集中近似推断表面法线。

总的来说,就是点云的法线可以便是点云的特征,如果法向量连续,可以判断是平面,法向量突变,是角点。

本节将针对后一种情况进行讲解,已知一个点云数据集,在其中的每个点处直接近似计算表面法线。

2、如何估计法向量

对于物体表面一点,将它和领域的点云看成是空间的椭球体,法向量方向对应椭球体的最短轴方向。
在这里插入图片描述
思路:要求一个点的法线,对这个点的k近邻拟合平面,求这个平面的法线。将问题转换成一个最小二乘平面拟合问题。
1)平面方程
常规的平面方程如下,这个方程是过原点的
在这里插入图片描述
对于k个点,我们先求得这些点的重心,确保这个平面是过重心的,这个过程就是将数据去中心化:
在这里插入图片描述
2)最小二乘拟合,计算协方差矩阵
理想情况下所有点都通过这个平面,但实际是不可能的,因此利用最小二乘算法,使得误差最小。
在这里插入图片描述

3)对协方差矩阵A进行SVD分解,最小的特征向量即为法向量(理解:椭圆的最短轴方向)
另一种理解:A有三个特征值,对应三个特征向量,求得AX

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/adfjadsklf/article/details/115112474

智能推荐

IDEA 出现问题:报错unable to establish loopback connection解决方案_caused by: java.io.ioexception: unable to establis-程序员宅基地

文章浏览阅读2.4w次。错误信息:Caused by: java.io.IOException: Unable to establish loopback connectionat sun.nio.ch.PipeImpl$Initializer.run(PipeImpl.java:101)at sun.nio.ch.PipeImpl$Initializer.run(PipeImpl.java:68)at java.security.AccessController.解决方案_caused by: java.io.ioexception: unable to establish loopback connection

酒店智能门锁方案功能及其特点介绍_门锁发卡系统用什么语言开发出来的-程序员宅基地

文章浏览阅读1.1k次。世界上自有门锁以来,门锁的变革经历了:机械锁—光孔锁—磁片锁—电子锁—智能感应卡锁,门锁不断地更新换代。进入九十年代后,智能卡锁以其无余伦比的优势创建了门锁新概念。计算机、电子机械和智能卡的诞生,门锁形成了完美的梦幻组合。电子门锁集计算机、电子机械、磁电技术为一体,以智能来控制门锁的开启,即给管理者带来安全、迅捷、自动化的管理模式,也给使用者提供了极大方便。科技以人为本,智能电子门锁的产生,源于人..._门锁发卡系统用什么语言开发出来的

IDEA没有自动检查语法,自动关联报错_idea的自动检查不触发-程序员宅基地

文章浏览阅读4.4k次。1 问题藐视idea没有自动报错.例如随便写一段错误代码,其关联类没有报错;新加一个接口方法其实现类没有实现,没有报错;其实就是没有自动检查语法合法性、2 产生原因2.1 开启了省电模式开启了省电模式,关掉即可。2.2 没有开启自动编译项目 2.3 inspection功能故障单击右下角小人头,检查高亮等级是否在none(没有)上,移到Inspections.以上三个问题检查一遍,基本可以解决问题。..._idea的自动检查不触发

mysql修改字段名称脚本_mysql数据库修改字段及新增字段脚本-程序员宅基地

文章浏览阅读1.3k次。1.修改字段的长度ALTER TABLE MODIFY COLUMN 字段名 数据类型(修改后的长度)例句:ALTER TABLE test_table MODIFY COLUMN id INT(20)2.修改字段的名称alter table change 。例句:ALTER TABLE test_tableCHANGE attence_name NAME VARCHAR(20)3...._mysql 修改字段脚本

黑马程序员学习日记(4)--继承、多态-程序员宅基地

文章浏览阅读466次。---------------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! -----------------------继承:用法。。父类派生子类;子类可以用父类的所有属性方法,还可以有自己的方法属性。子类除了不能继承父类的构造函数和析构函数外,可以继承父类所有的成员和方法。子类不能直接修改父类的私有成员,只能通过父类的公有方法对其

1028: C语言程序设计教程(第三版)课后习题8.2-程序员宅基地

文章浏览阅读675次。题目描述求方程 的根,用三个函数分别求当b^2-4ac大于0、等于0、和小于0时的根,并输出结果。从主函数输入a、b、c的值。输入a b c输出x1=? x2=?样例输入4 1 1样例输出x1=-0.125+0.484i x2=-0.125-0.484i 1 #include <stdio.h> 2 #include <math.h..._1028:c语言程序设计教程(第三版)课后习题8.2

随便推点

Qt学习之《C++ GUI Qt4编程》(第14章)多线程互斥量使用错误_qt使用互斥锁编译出错-程序员宅基地

文章浏览阅读408次。虽然一直使用VC,但很久之前有使用过Qt写过一些小工具,但没有完整看过Qt一些相关书籍,最近看书发现《C++ GUI Qt4编程》(第14章)多线程互斥量使用好像有问题。 《C++ GUI Qt4编程》(第14章)14.2 这一节将QMutex定义在了 Thread 类下,编译调试书本中的例子,发现使用QMutex Lock()方法会报错: The infer_qt使用互斥锁编译出错

源码解读腾讯 GT 的性能测试方案_service call surfaceflinger-程序员宅基地

文章浏览阅读4.5k次,点赞2次,收藏6次。前言本文将整理腾讯GT各个性能测试项的测试方法,目的是为了帮助移动性能专项测试同学快速过一遍腾讯GT各个性能数据是如何获取的。 一.GT性能测试方案之CPU测试1.简要流程 初始化cpu的数据 提供了两种方法获取CPU数据 getCpuUsage: 整机的CPU使用水平,主要用于实时刷新GT上的CPU数据。通过读取/proc/stat的数据,将每一个核的cpu使用跟闲..._service call surfaceflinger

PHP - 垃圾回收机制收集_gc_collect_cycles 是分进程吗-程序员宅基地

文章浏览阅读3.9k次。了解学习PHP[内存]垃圾回收机制, 帮助理解编程语言的运行机制, 提高开发水平._gc_collect_cycles 是分进程吗

Matlab 绘制两端带尖角(两端尖尖,尖色头条)的colorbar_matlab画图例带尖角-程序员宅基地

文章浏览阅读4.6k次,点赞6次,收藏22次。其实这样的colorbar可以直接手动画出来,不多说,直接上代码cmap = [69 117 180 116 173 203 171 217 233 254 224 144 253 174 77 244 109 67 215 48 39 165 0 38]/255;%画图的部分代码colormap(ax,cmap);xmin = -1..._matlab画图例带尖角

pb与java_Java中使用PB教程-程序员宅基地

文章浏览阅读1.6k次。前言之前在写Netty的时候,说过要写一篇关于PB的应用,所以现在兑现承诺。在应用的过程中,发现了很多问题,本文主要介绍两个最关键的问题。PB如何与java项目融合,自动刷新编译,以及pb文件如何与其他项目共用,互不影响。java中如何实现pb的Extension概述ProtocolBuff 是 google 提出的的一种数据交换格式,跨语言,跨平台,可扩展。基于这种特性广泛的用于网络数据通信。目..._java开发pb接口

线程的同步_package com.atguigu.java1; //死锁的演示 class a { publi-程序员宅基地

文章浏览阅读230次。线程的同步1.背景2.同步代码块和同步方法package com.atguigu.java;/** * 例子:创建三个窗口卖票,总票数为100张.使用实现Runnable接口的方式 * * 1.问题:卖票过程中,出现了重票、错票 -->出现了线程的安全问题 * 2.问题出现的原因:当某个线程操作车票的过程中,尚未操作完成时,其他线程参与进来,也操作车票。 * 3.如何解决:当一个线程a在操作ticket的时候,其他线程不能参与进来。直到线程a操作完ticket时,其他_package com.atguigu.java1; //死锁的演示 class a { public synchronized void