OpenCV中feature2D学习——ORB和BruteForceMatcher
来源:互联网 发布:网络使人疏远 反方问题 编辑:程序博客网 时间:2024/05/17 07:45
本文转载自http://blog.csdn.net/holybin/article/details/48776949,尊重原创,备份在此,只为日后方便查阅,如有冒犯,请告知。
一、ORB详细介绍
(该部分转自:http://www.cvchina.info/2011/07/04/whats-orb/)
ORB是是ORiented Brief的简称。ORB的论文:http://www.willowgarage.com/sites/default/files/orb_final.pdf
首先介绍Brief:
Brief是Binary Robust Independent Elementary Features的缩写。这个特征描述子是由EPFL的Calonder在ECCV2010上提出的。主要思路就是在特征点附近随机选取若干点对,将这些点对的灰度值的大小,组合成一个二进制串,并将这个二进制串作为该特征点的特征描述子。详细算法描述参考如下论文:
Calonder M., Lepetit V., Strecha C., Fua P.: BRIEF: Binary Robust Independent Elementary Features. ECCV 2010
注意在BRIEF eccv2010的文章中,BRIEF描述子中的每一位是由随机选取的两个像素点做二进制比较得来的。文章同样提到,在此之前,需要选取合适的gaussian kernel对图像做平滑处理。(为什么要强调这一点,因为下述的ORB对此作了改进。)
BRIEF的优点在于速度,缺点也相当明显:
1:不具备旋转不变性。
2:对噪声敏感
3:不具备尺度不变性。
ORB就是试图解决上述缺点中的1和2.
如何解决旋转不变性:
在ORB的方案中,是采用了FAST作为特征点检测算子。在Sift的方案中,特征点的主方向是由梯度直方图的最大值和次大值所在的bin对应的方向决定的。略嫌耗时。
在ORB的方案中,特征点的主方向是通过矩(moment)计算而来,公式如下:
有了主方向之后,就可以依据该主方向提取BRIEF描述子。但是由此带来的问题是,由于主方向会发生变化,随机点对的相关性会比较大,从而降低描述子的判别性。解决方案也很直接,采取贪婪的,穷举的方法,暴力找到相关性较低的随机点对。
如何解决对噪声敏感的问题:
在前面提到过,在最早的eccv2010的文章中,BRIEF使用的是pixel跟pixel的大小来构造描述子的每一个bit。这样的后果就是对噪声敏感。因此,在ORB的方案中,做了这样的改进,不再使用pixel-pair,而是使用9×9的patch-pair,也就是说,对比patch的像素值之和。(可以通过积分图快速计算)。
关于尺度不变性:
ORB没有试图解决尺度不变性,(因为FAST本身就不具有尺度不变性。)但是这样只求速度的特征描述子,一般都是应用在实时的视频处理中的,这样的话就可以通过跟踪还有一些启发式的策略来解决尺度不变性的问题。
关于计算速度:
ORB是sift的100倍,是surf的10倍。
关于性能:
下面是一个性能对比,ORB还是很给力。点击看大图。
二、代码示例
1、在使用ORB做特征提取和匹配时,首先需要注意matcher的匹配类型:
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
(参考:http://blog.csdn.net/holybin/article/details/40926315)
代码如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
结果:
2、有大牛对于ORB定位目标时透视变换耗时长的问题做了优化,提出了用keypoints的x与y坐标和的平均值作为目标中心点的近似估计:http://blog.csdn.net/yangtrees/article/details/7545820
- OpenCV中feature2D学习——ORB和BruteForceMatcher
- OpenCV中feature2D学习——ORB和BruteForceMatcher
- OpenCV中feature2D学习——ORB和BruteForceMatcher
- OpenCV中feature2D学习——BFMatcher和FlannBasedMatcher
- OpenCV中feature2D学习——Harris角点检测
- OpenCV中feature2D学习——FAST特征点检测
- OpenCV中feature2D学习——SURF和SIFT算子实现特征点检测
- OpenCV中feature2D学习——SIFT和SURF算子实现特征点提取与匹配
- OpenCV中feature2D学习——SIFT和SURF算法实现目标检测
- OpenCV中feature2D学习——SIFT和SURF算法实现目标检测
- OpenCV中feature2D学习——SURF和SIFT算子实现特征点检测
- OpenCV中feature2D学习——SIFT和SURF算子实现特征点提取与匹配
- OpenCV中feature2D学习——Shi-Tomasi角点检测
- OpenCV中feature2D学习——自定义角点检测函数
- OpenCV中feature2D学习——亚像素级角点检测(cornerSubPix)
- OpenCV中feature2D学习——亚像素级角点检测(cornerSubPix)
- OpenCV学习笔记——2维特征Feature2D,SURF
- OPENCV中BFMatcher(BruteForceMatcher)和FlannBasedMatcher区别
- 视频信号vsync hsync dotclock 的关系
- 在Delphi中动态地使用SQL查询语句
- 节假日管理-java swing+mysql
- 解除安卓手机锁
- 纳税服务系统【用户模块之用户唯一性校验】
- OpenCV中feature2D学习——ORB和BruteForceMatcher
- Linux基础-4
- Altium Designer中关于PCB及原理绘制那些高级玩意总结
- ios 常用宏定义大全
- 信息化系统工程IPTV或OTT-TV节目系统解决方案
- Ubuntu安装fossolgy
- 如何理解Android中的xmlns && Lint
- zabbix监控系统-部署规划
- 使用account lock或者account unlock语句