matlab练习程序(点云表面法向量)
思路还是很容易想到的: 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建立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