博客转载自:http://www.cnblogs.com/ironstark/p/5971976.html

机器人视觉中有一项重要人物就是从场景中提取物体的位置,姿态。图像处理算法借助Deep Learning 的东风已经在图像的物体标记领域耍的飞起了。而从三维场景中提取物体还有待研究。目前已有的思路是先提取关键点,再使用各种局部特征描述子对关键点进行描述,最后与待检测物体进行比对,得到点-点的匹配。个别文章在之后还采取了ICP对匹配结果进行优化。

对于缺乏表面纹理信息,或局部曲率变化很小,或点云本身就非常稀疏的物体,采用局部特征描述子很难有效的提取到匹配对。所以就有了所谓基于Point Pair 的特征,该特征使用了一些全局的信息来进行匹配,更神奇的是,最终的位姿估计结果并不会陷入局部最小值。详细可参见论文:Model globally, match locally: Efficient and robust 3D object recognition. 与 Going further with point pair features。SLAM的重要研究方向object based Slam 也声称使用了Point Pair Feature进行匹配。

为了更好的理解这种方法,而在pcl中也没有找到现成的算法,所以我自己用matlab实现了一遍

算法的思想很简单:

0、ppf 特征为[d,<d,n1>,<d,n2>,<n1,n2>].

1、针对目标模型,在两两点之间构造点对特征F,如果有N个点,那么就有N*N个特征(说明此算法是O(N2)的),N*N个特征形成特征集F_Set

2、在场景中任意取1定点a,再任意取1动点b,构造ppf特征,并从F_set中寻找对应的,那么理想情况下,如果找到了完全匹配的特征,则可获得点云匹配的结果。

3、此算法是一种投票算法,每次匹配都能得到一个旋转角度,如果m个b都投票给了某一旋转角度则可认为匹配成功

这个算法最大的问题就是不停的采样会导致极大的计算量。不过算法本身确实可以匹配物体和场景。

//ppf 特征的构建function obj = ppf(point1,point2)
     d = point1.Location - point2.Location;
     d_unit = d/norm(d);
     apha1 = acos(point1.Normal*d_unit');
     apha2 = acos(point2.Normal*d_unit');
     apha3 = acos(point1.Normal*point2.Normal');
     obj = [norm(d),apha1,apha2,apha3];
 end

ppf 特征集的构建

classdef modelFeatureSet < handle
      %MODELFEATURESET 此处显示有关此类的摘要
      %   此处显示详细说明

      properties
          FeatureTree
          ModelPointCloud
          Pairs
      end

     methods
         function obj = modelFeatureSet(pt)
             obj.ModelPointCloud = copy(pt.removeInvalidPoints());
         end
         function growTree(self)
             self.ModelPointCloud = pcdownsample(self.ModelPointCloud,);
             pt_size = self.ModelPointCloud.Count;
             idx = repmat(:pt_size,pt_size,);
             tmp1 = reshape(idx,pt_size*pt_size,);
             tmp2 = reshape(idx',pt_size*pt_size,1);
             pairs = [tmp1,tmp2];
             rnd = randseed(,,,,pt_size*pt_size);
             pairs = pairs(rnd,:);
             Features = zeros(size(pairs,),);
             :size(pairs,)
                 Features(i,:) = ppf(self.ModelPointCloud.)),...
                                     self.ModelPointCloud.)));
             end
             self.FeatureTree = createns(Features);
             self.Pairs = pairs;
         end
     end
 end

最新文章

  1. Majority Number I &amp; || &amp;&amp; |||
  2. CSS3中的counter和content属性,一些简单的内容显示就不需要JS去实现了
  3. [jQuery].scrollTop() 函数详解
  4. Java中使用验证码和二维码
  5. C# 将字符串转化成流,将流转换成字符串
  6. AutoCompleteTextView输入汉字拼音首字母实现过滤提示(支持多音字,Filterable的使用)
  7. Oracle 课程三之表设计
  8. nyoj VF函数
  9. C#的tooltip自动消失之后就不再显示了解决办法
  10. QT 信号与槽 QT简单加法器的实现
  11. IOS中的JSON数据的解析
  12. linux函数的阻塞与非阻塞IO及错误处理
  13. YAML学习
  14. 【php增删改查实例】第二十节 - 把用户管理页面集成到main.php中
  15. CF 1023
  16. python str,list,tuple转换
  17. nginx的proxy_pass路径转发规则浅析(末尾/问题)
  18. Java项目生成可执行jar包、exe文件以及在Windows下的安装文件
  19. [Functional Programming] mapReduce over Async operations and fanout results in Pair(rejected, resolved) (fanout, flip, mapReduce)
  20. “全栈2019”Java第一百零九章:匿名内部类实现唯一抽象类或接口

热门文章

  1. SpringBoot WebSocket实现
  2. 剑指offer-7.旋转数组的最小数字
  3. spring学习-4
  4. 加密算法之BLOWFISH算法
  5. Java演示手机发送短信验证码功能实现
  6. JSDoc 介绍
  7. webpack里CommonJS的require与ES6 的module.exports加载模块有何不同
  8. 前端用户输入校验--基于JQ
  9. centos7 showdoc 安装部署
  10. bzoj 5092 [Lydsy1711月赛]分割序列——高维前缀和