- 1. 学习如何在你的电脑上配置OpenCV-Python环境!
- 1.1 开始了解OpenCV-Python
- 1.2 在 Windows 下安装 OpenCV-Python
- 1.3 在 Fedora 环境下安装 OpenCV-Python
- 1.4 在 Debian(Ubuntu)中配置 OpenCV-Python
- 1.5 在Docker中安装OpenCV-Python
- 1.6 在树莓派配置OpenCV-Python
- 2. OpenCV中的GUI功能
- 2.1 开始使用图像
- 2.2 开始使用视频
- 2.3 OpenCV 中的绘图函数
- 2.4 以鼠标为画笔
- 2.5 用滑块控制条做调色板
- 3. OpenCV中的GUI功能
- 3.1 图片基本操作
- 3.2 图像算术操作
- 3.3 性能评估与改进技巧
- 4. OpenCV中的图像处理
- 4.1 更换颜色空间
- 4.2 对图像进行几何变换
- 4.3 图像二值化处理
- 4.4 平滑图像
- 4.5 形态学转换
- 4.6 图像梯度
- 4.7 Canny边缘检测
- 4.8 图像金字塔
- 4.9.1 直方图:查找,绘制,分析
- 4.9.2 直方图均衡化
- 4.9.3 二维直方图
- 4.9.4 直方图反投影
- 4.10 OpenCV中的图像变换
- 4.10.1 傅立叶变换
- 4.11 模板匹配
- 4.12 霍夫直线变换
- 4.13 霍夫圆变换
- 4.14 基于分水岭算法的图像分割
- 4.14 使用 GrabCut 算法交互式前景提取
- 5. 特征检测和描述符
- 5.1 理解特征
- 5.2 Harris 角点检测
- 5.3 Shi-Tomasi 角点检测 & 适合用来跟踪的特征
- 5.4 介绍SIFT(尺度不变特征转换)
- 5.5 介绍SURF(加速稳健特征)
- 5.6 角点检测的FAST算法
- 5.7 BRIEF特征点描述算法
- 5.8 ORB 特征描述符(Oriented FAST and Rotated BRIEF)
- 5.9 特征匹配
- 5.10 特征匹配和使用单应性匹配来搜索物体
- 6. 视频分析
- 6.1 Meanshift和Camshift
- 6.2 光流
- 6.3 背景分割
- 7. 相机校准和3D重建
- 7.1 相机校准
- 7.2 姿势估计
- 7.3 极线几何
- 7.4 来自立体图像的深度图
- 8. 机器学习
- 8.1 K-最近邻算法
- 8.1.1 了解k-最近邻算法
- 8.1.2 使用kNN进行手写字符的OCR
- 8.2 支持向量机(SVM)
- 8.2.1 理解SVM
- 8.2.2 使用SVM的手写数据的OCR
- 8.3 K-Means聚类
- 8.3.1 理解 K-Means 聚类
- 8.3.2 OpenCV中的K-Means聚类
- 9. 计算摄影学
- 9.1 图像去噪
- 9.2 图像修复
- 9.3 高动态范围(HDR)
- 10. 目标检测
- 10.1 使用 Haar Cascades 的面部识别
- 11. OpenCV-Python 绑定
- 11.1 OpenCV-Python绑定如何工作?
5.8 ORB 特征描述符(Oriented FAST and Rotated BRIEF)
目标
在这一章中,我们将学习 ORB 的基础
理论基础
作为 OpenCV 爱好者,关于 ORB 最重要的是它来自 OpenCV 实验室。
这个算法是由 Ethan Rublee,Vincent Rabaud,Kurt Konolige 和 Gary R. Bradski 在他们的论文《ORB: An efficient alternative to SIFT or SURF》[^1 ]提出。正如标题所说,这是一个在计算成本,匹配性能和,最重要的,专利方面,SIFT和SURF的一个很好的替代品。
是的,SIFT 和 SURF 已经获得专利,使用它们时应该付钱。 但ORB则不是这样!!
ORB 基本上是 FAST 关键点检测器和BRIEF描述符的融合,并有许多修改以提高性能。 首先使用FAST找到关键点,然后应用Harris角点测量来找到其中的最高N个点。 它也使用金字塔来产生多尺度特征。 但是有一个问题,FAST不计算方向。 那么如果需要旋转不变性怎么办? 作者对于原有算法提出了以下修改。
它计算位于中心角的片段的强度加权质心。 这个角点到质心的矢量的方向就是特征点的方向。 为了改善旋转不变性,用x和y来计算矩,其应该在半径为$r$的圆形区域中,其中$r$是片段的大小。
现在来看看描述符,ORB 使用 BRIEF 描述符。 但是我们已经看到,对于旋转,BRIEF表现不佳。 ORB所做的就是根据关键点的方向来“引导”BRIEF。 对于在位置$(x_i,yi)$的$n$个二进制测试的任何特征集合,定义包含这些像素的坐标的 $2*n$ 的矩阵 $S$。 然后使用片段的方向 $\theta$,找到它的旋转矩阵并旋转 $S$ 以得到导向(旋转)过的版本 $S\theta$。
ORB 将该角度离散为 $\frac {2\pi} {30}$(12度)的增量,并构建一个预先计算好的BRIEF模式的查找表。只要关键点取向$\theta$在视图之间是一致的,正确的一组点$S_\theta$将被用来计算它的描述符。
BRIEF具有一个重要的特点,即每个位特征具有很大的方差和接近0.5的平均值。但一旦以关键点为导向,就会失去这种属性,变得更加分散。
高的方差使得特征更具有区别性,因为它对输入有不同的响应。
另一个理想的特性是使测试不相关,因为每个测试都会对测试结果产生影响。为了解决所有这些问题,ORB在所有可能的二进制测试中运行一个贪婪的搜索,以找到具有高的方差、值平均接近0.5以及测试不相关的的那些。
结果被称为 rBRIEF。
对于描述符匹配,使用了从传统 LSH 改进而来的多探针 LSH。这篇论文说ORB比SURF和SIFT快得多,ORB描述符比SURF更好。 ORB是低功耗设备进行全景拼接等计算的理想选择。
OpenCV 中的 ORB
像往常一样,我们必须使用函数 cv2.ORB()
或使用 feature2d 的通用接口来创建一个ORB对象。 它有一些可选的参数。 最有用的是 nFeatures
,表示要保留的特征的最大数量(默认为500),scoreType
表示是否使用Harris分数或FAST分数来排列特征(默认为Harris分数)。另一个参数 WTA_K
决定产生定向的BRIEF描述符的每个元素的点数。 默认情况下,这个值是2,即一次选择两个点。 在这种情况下,匹配使用 NORM_HAMMING
距离。
如果 WTA_K
是3或者4,那么需要3或者4个点来生成BRIEF描述符,那么匹配就使用NORM_HAMMING2
。
下面是一个显示ORB使用的简单代码。
import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('simple.jpg',0)
# 初始化ORB检测器
orb = cv2.ORB_create()
# 用ORB查找关键点
kp = orb.detect(img,None)
# 用ORB计算描述子
kp, des = orb.compute(img, kp)
# 只绘制关键点位置,不绘制大小和方向
img2 = cv2.drawKeypoints(img, kp, None, color=(0,255,0), flags=0)
plt.imshow(img2), plt.show()
我们将在其他章节中讲解使用 ORB 特征来做匹配。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论