内容简介:思路还是很容易想到的:1.首先使用KD树寻找当前点邻域的N个点,这里取了10个,直接调用了vlfeat。2.用最小二乘估计当前邻域点组成的平面,得到法向量。
思路还是很容易想到的:
1.首先使用KD树寻找当前点邻域的N个点,这里取了10个,直接调用了vlfeat。
2.用最小二乘估计当前邻域点组成的平面,得到法向量。
3.根据当前邻域点平均值确定邻域质心,通常质心会在弯曲表面的内部,反方向即为法线方向。
vlfeat在这里下载 ,如何配置我就不多说了。
处理效果如下:
原始点云:
点云表面法向量,做了降采样处理:
兔子果断变刺猬。
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建立kdtree normE=[]; 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 = 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<0 dis = -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));
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 次表面散射
- [译]Vulkan教程(09)窗口表面
- 图解:链表的快慢指针,解决 80% 的链表面试题
- 深度长文:表面繁荣之下,人工智能的发展已陷入困境
- 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
- 这届程序员:表面正经写代码,暗地里是个灵魂画手
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
推荐系统
[奥地利] Dietmar Jannach、Markus Zanker、Alexander Felfernig、Gerhard Friedrich / 蒋 凡 / 人民邮电出版社 / 2013-6-25 / 59.00元
编辑推荐: 通过对本书的学习,读者不仅可以全面系统地了解该领域的基础原理,还能试验如何搭建一套真正的推荐系统。 —— 百度主任架构师、百度技术委员会主席 廖若雪 本书比较全面地介绍了推荐系统涉及的相关知识点,很适合对于推荐系统感兴趣的相关人员作为入门教程,目前能够系统全面介绍相关技术的中文书籍还显得匮乏,相信这本译著对于缓解这种情况大有裨益。 ——新浪微博数据挖掘技术专家 ......一起来看看 《推荐系统》 这本书的介绍吧!