设为首页收藏本站

EPS数据狗论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1772|回复: 1

matlab练习程序(点云表面法向量)

[复制链接]

17

主题

222

金钱

324

积分

入门用户

发表于 2019-4-10 14:52:53 | 显示全部楼层 |阅读模式

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

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

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

vlfeat下载地址:http://www.vlfeat.org/

处理效果如下:
原始点云:
1.png

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

兔子果断变刺猬。

matlab代码如下:
  1. clear all;
  2. close all;
  3. clc;
  4. warning off;

  5. pc = pcread('rabbit.pcd');
  6. pc=pcdownsample(pc,'random',0.3);       %0.3倍降采样
  7. pcshow(pc);

  8. pc_point = pc.Location';                %得到点云数据
  9. kdtree = vl_kdtreebuild(pc_point);      %使用vlfeat建立kdtree

  10. normE=[];
  11. for i=1:length(pc_point)
  12.    
  13.     p_cur = pc_point(:,i);
  14.     [index, distance] = vl_kdtreequery(kdtree, pc_point, p_cur, 'NumNeighbors', 10);    %寻找当前点最近的10个点
  15.     p_neighbour = pc_point(:,index)';
  16.     p_cent = mean(p_neighbour);     %得到局部点云平均值,便于计算法向量长度和方向
  17.    
  18.     %最小二乘估计平面
  19.     X=p_neighbour(:,1);
  20.     Y=p_neighbour(:,2);
  21.     Z=p_neighbour(:,3);
  22.     XX=[X Y ones(length(index),1)];
  23.     YY=Z;
  24.     %得到平面法向量
  25.     C=(XX'*XX)\XX'*YY;
  26.    
  27.     %局部平面指向局部质心的向量
  28.     dir1 = p_cent-p_cur';
  29.     %局部平面法向量
  30.     dir2=[C(1) C(2) -1];
  31.    
  32.     %计算两个向量的夹角
  33.     ang = dir1.*dir2 / (sqrt(dir1(1)^2 +dir2(1)^2) + sqrt(dir1(2)^2 +dir2(2)^2)+sqrt(dir1(3)^2 +dir2(3)^2) );
  34.    
  35.     %根据夹角判断法向量正确的指向
  36.     flag = acos(ang);
  37.     dis = norm(dir1);
  38.     if flag<0
  39.         dis = -dis;
  40.     end
  41.    
  42.     %画出当前点的表面法向量
  43.     t=(0:dis/100:dis)';
  44.     x = p_cur(1) + C(1)*t;
  45.     y = p_cur(2) + C(2)*t;
  46.     z = p_cur(3) + (-1)*t;
  47.    
  48.     normE =[normE;x y z];
  49.     i
  50. end
  51. pcshowpair(pc,pointCloud(normE));
复制代码

2

主题

4628

金钱

7816

积分

高级用户

发表于 2019-4-14 09:52:59 | 显示全部楼层
matlab难不难学
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

客服中心
关闭
在线时间:
周一~周五
8:30-17:30
QQ群:
653541906
联系电话:
010-85786021-8017
在线咨询
客服中心

意见反馈|网站地图|手机版|小黑屋|EPS数据狗论坛 ( 京ICP备09019565号-3 )   

Powered by BFIT! X3.4

© 2008-2028 BFIT Inc.

快速回复 返回顶部 返回列表