三维计算机视觉 — 中层次视觉 — Point Pair Feature
机器人视觉中有一项重要人物就是从场景中提取物体的位置,姿态。图像处理算法借助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,'GridAverage',.);
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,),);
for i = :size(pairs,)
Features(i,:) = ppf(self.ModelPointCloud.select(pairs(i,)),...
self.ModelPointCloud.select(pairs(i,)));
end
self.FeatureTree = createns(Features);
self.Pairs = pairs;
end
end
end
三维计算机视觉 — 中层次视觉 — Point Pair Feature的更多相关文章
- 三维计算机视觉 —— 中层次视觉 —— RCNN Family
RCNN是从图像中检测物体位置的方法,严格来讲不属于三维计算机视觉.但是这种方法却又非常非常重要,对三维物体的检测非常有启发,所以在这里做个总结. 1.RCNN - the original idea ...
- point pair feature在2D图像匹配中的应用
point pair feature在2D图像匹配中的应用 point pair feature(ppf) @article{BertramDrost2010ModelGM, title={Model ...
- PCL — Point Pair Feature 中层次点云处理
博客转载自:http://www.cnblogs.com/ironstark/p/5971976.html 机器人视觉中有一项重要人物就是从场景中提取物体的位置,姿态.图像处理算法借助Deep Lea ...
- PCL—低层次视觉—关键点检测(NARF)
关键点检测本质上来说,并不是一个独立的部分,它往往和特征描述联系在一起,再将特征描述和识别.寻物联系在一起.关键点检测可以说是通往高层次视觉的重要基础.但本章节仅在低层次视觉上讨论点云处理问题,故所有 ...
- PCL —— RCNN Family 中层次点云处理
博客转载自:http://www.cnblogs.com/ironstark/p/6046411.html RCNN是从图像中检测物体位置的方法,严格来讲不属于三维计算机视觉.但是这种方法却又非常非常 ...
- PCL—低层次视觉—关键点检测(rangeImage)
关键点又称为感兴趣的点,是低层次视觉通往高层次视觉的捷径,抑或是高层次感知对低层次处理手段的妥协. ——三维视觉关键点检测 1.关键点,线,面 关键点=特征点: 关键线=边缘: 关键面=foregro ...
- PCL—低层次视觉—点云分割(邻近信息)
分割给人最直观的影响大概就是邻居和我不一样.比如某条界线这边是中华文明,界线那边是西方文,最简单的分割方式就是在边界上找些居民问:"小伙子,你到底能不能上油管啊?”.然后把能上油管的居民坐标 ...
- [Deep-Learning-with-Python]计算机视觉中的深度学习
包括: 理解卷积神经网络 使用数据增强缓解过拟合 使用预训练卷积网络做特征提取 微调预训练网络模型 可视化卷积网络学习结果以及分类决策过程 介绍卷积神经网络,convnets,深度学习在计算机视觉方面 ...
- 计算机视觉中的词袋模型(Bow,Bag-of-words)
计算机视觉中的词袋模型(Bow,Bag-of-words) Bag-of-words 读 'xw20084898的专栏'的blogBag-of-words model in computer visi ...
随机推荐
- Docker卸载高版本重装低版本后启动提示:driver not supported
解决方法: mv /var/lib/docker /var/lib/docker.old 其实就是docker镜像文件夹目录作怪,新版本的目录无法与旧版本目录相兼容. 不过建议降级的用户这样操作: y ...
- 为什么样本方差分母是n-1
https://blog.csdn.net/qq_39521554/article/details/79633207 为什么样本方差的分母是n-1?为什么它又叫做无偏估计? 至于为什么是n-1,可以看 ...
- 小程序longpress的bug及其解决
我的小程序中,用到一个长按修改的功能,设计是这样的,短按tap,长按longpress 但是,偶尔出现长按无效的情况.我自己都经常碰到,今天仔细研究,用半天时间反复寻找,重现,发现问题和内存或别的因素 ...
- 解决Android Studio出现GC overhead limit exceeded
方法一: 修改项目目录下的gradle.properties,增加如下配置信息(红色文字中需要根据自己电脑的配置修改内存大小,其余的配置用于加快gradle的编译速度) org.gradle.daem ...
- from __future__ import unicode_literals
为了适应Python 3.x的新的字符串的表示方法,在2.7版本的代码中,可以通过unicode_literals来使用Python 3.x的新的语法
- 记录一次使用VS2015编译错误的原因查找(boost+gdal)
编译错误说明 在一个解决方案中的项目A中使用到了boost,完全没有问题.在项目B中也使用了boost库,编译的时候就产生了一堆错误. 原因查找 两个项目通过对比,唯一的不同就是项目B使用了gdal库 ...
- 微信SDK登录无法调起,微信SDK无法接收回调的几种解决办法
今天有位同事请求帮忙调试微信登录问题,他遇到了以下2个问题,所以,写篇日志备忘,如果有其它朋友遇到此类问题,都可以照此解决! 平时在开发中,有些开发者经常会遇到微信登录SDK登录时,无法调起微信客户端 ...
- What is a Back Order
What is a Back Order A back order is a customer order that has not been fulfilled. A back order gene ...
- Mina简单的入门示例
Mina是Apache下的一个网络应用程序框架,用来帮助用户简单地开发高性能和高可扩展性的网络应用程序.它提供了一个通过Java NIO在不同的传输协议上抽象的事件驱动的异步API,例如TCP/IP和 ...
- re.S、 re.M
re.S是代表.可以匹配\n以及“ re.M是多行 code import re a = '''asdfsafhellopass: 234455 worldafdsf ''' b = re.fi ...