思路还是很容易想到的:

1.首先使用KD树寻找当前点邻域的N个点,这里取了10个,直接调用了vlfeat。

2.用最小二乘估计当前邻域点组成的平面,得到法向量。

3.根据当前邻域点平均值确定邻域质心,通常质心会在弯曲表面的内部,反方向即为法线方向。

vlfeat在这里下载,配置参考这里,rabbit.pcd下载地址

处理效果如下:

原始点云:

点云表面法向量,做了降采样处理:

兔子果断变刺猬。

matlab代码如下:

clear all;
close all;
clc;
warning off;pc = pcread('rabbit.pcd');
pc=pcdownsample(pc,'random',0.3);       %0.3倍降采样
pcshow(pc);pc_point = pc.Location';                %得到点云数据
kdtree = vl_kdtreebuild(pc_point);      %使用vlfeat建立kdtreenormE=[];
for i=1:length(pc_point)p_cur = pc_point(:,i);[index, distance] = vl_kdtreequery(kdtree, pc_point, p_cur, 'NumNeighbors', 10);    %寻找当前点最近的10个点p_neighbour = pc_point(:,index)';p_cent = mean(p_neighbour);     %得到局部点云平均值,便于计算法向量长度和方向%最小二乘估计平面X=p_neighbour(:,1);Y=p_neighbour(:,2);Z=p_neighbour(:,3);XX=[X Y ones(length(index),1)];YY=Z;%得到平面法向量C=(XX'*XX)\XX'*YY;%局部平面指向局部质心的向量dir1 = p_cent-p_cur';%局部平面法向量dir2=[C(1) C(2) -1];%计算两个向量的夹角ang = sum(dir1.*dir2) / (sqrt(dir1(1)^2 +dir2(1)^2) + sqrt(dir1(2)^2 +dir2(2)^2)+sqrt(dir1(3)^2 +dir2(3)^2) );%根据夹角判断法向量正确的指向flag = acos(ang);dis = norm(dir1);if flag<0dis = -dis;end%画出当前点的表面法向量t=(0:dis/100:dis)';x = p_cur(1) + C(1)*t;y = p_cur(2) + C(2)*t;z = p_cur(3) + (-1)*t;normE =[normE;x y z];i
end
pcshowpair(pc,pointCloud(normE));

matlab练习程序(点云表面法向量)相关推荐

  1. PCL之估计整个点云表面法向量

    代码展示: #include <string> #include <iostream> #include <pcl/io/pcd_io.h> #include &l ...

  2. PCL估计点云的表面法向量

    PCL估计点云的表面法向量 估计点云表面法向量的方法 理论基础 法线确定方法 法线方向确定 选择合适的邻域尺度 PCL估计表面法线代码实现 用OpenMP加速法线估计 参考资料 估计点云表面法向量的方 ...

  3. 光度立体(一)- 基于先验信息的快速表面法向量求解

    基于先验信息的快速表面法向量求解 一.光度立体法简介 二.经典光度立体法求解法向量 三.基于先验信息快速求解法向量 一.光度立体法简介 光度立体法(Photometric Stereo)是一种使用多个 ...

  4. matlab hilb,MATLAB在科学计算中的应用:第2章 MATLAB 语言程序设计基础

    <MATLAB在科学计算中的应用:第2章 MATLAB 语言程序设计基础>由会员分享,可在线阅读,更多相关<MATLAB在科学计算中的应用:第2章 MATLAB 语言程序设计基础(7 ...

  5. matlab多元回归程序,多元回归程序MATLAB程序

    <多元回归程序MATLAB程序>由会员分享,可在线阅读,更多相关<多元回归程序MATLAB程序(45页珍藏版)>请在人人文库网上搜索. 1.程序MATLAB多元回归程序matl ...

  6. 无源定位之时差估计的精确时差估计算法(ETDE)及MATLAB实现程序

    精确时差估计算法(ETDE)及MATLAB实现程序 算法原理 算法总结 性能分析 实验结果 算法原理 假设两接收站分别接收的带噪信号为 {x(kT)=s(kT)+ε1(kT)y(kT)=s(kT−D) ...

  7. matlab潮流程序,IEEE33节点matlab潮流程序.doc

    IEEE33节点matlab潮流程序 Bus [1,0,0 ; 2,100, 60; 3,90,40; 4,120,80; 5,60,30; 6,60,20; 7, 200, 100 ; 8,200, ...

  8. 微信小程序访问云数据库

     1.Copy官网测试代码另保存Test.html ,修改APPID和ENVID      公众号使用云开发 / 极简示例 / HTML | 微信开放文档 (qq.com) <html>& ...

  9. matlab有意思程序,matlab有意思的小程序

    10个C++趣味小程序,很有意思的.VIP专享文档 VIP专享文档是百度文库认... 现在很多人使用微信的时间已经非常长了,他们注册的微信号往上可能已经是5年前的事情了,正是由于不少使用者在这个过程当 ...

最新文章

  1. ‘wmic‘ 不是内部或外部命令,也不是可运行的程序 解决方法
  2. 面试题整理19 矩阵Z字形扫描
  3. vim的全局替换[zz]把字符替换成回车
  4. idea2018.3.5集成scala开发环境
  5. html boot设置列宽,html - Bootstrap 4:设置列宽固定位置内容的宽度 - SO中文参考 - www.soinside.com...
  6. java 9999 符号_按格式生成序号,如0001,0002...9999
  7. ipython 更好的交互环境
  8. 动态规划之最长回文串
  9. 实战MHDD检测硬盘
  10. 简单易懂——Dijkstra算法讲解
  11. 【转】ASP.NET AJAX入门系列(9):使用ScriptManager控件
  12. mock.js那点事(上)
  13. Unity3D ML-agents 入坑指导
  14. js 大数字单位处理 千、万、千万、亿....
  15. P型半导体、N型半导体定义
  16. python中去掉字符串中的空格
  17. Port 1-1023
  18. Java第十章复习 I/O输入输出
  19. Bookmarks_2012_06_13
  20. 爬虫获取王者荣耀全英雄皮肤

热门文章

  1. jpa 删除是否成功_JPA / Hibernate删除实体有时不起作用
  2. vue 请求多个api_Vue 创建多人共享博客
  3. mysql 累计值_mysql 累计值计算
  4. SpringBoot静态资源的映射
  5. 数据结构实验之链表五:单链表的拆分_JAVA
  6. 机器视觉资料汇总(2)
  7. 学习笔记——Java
  8. 深度信念网络Deep Belief Networks资料汇总
  9. 多种特征提取算法比较汇总
  10. 答与微博前端教主在吃饭时讨论到的一道微软面试题