OpenCV学习笔记-ORB

一、原理
具体原理参考博客: ORB原理,这里只是简单介绍
SIFT 和 SURF 算法是有专利保护的 如果你 使用它们 就可能要花钱 。但是 ORB 不需要

ORB基本是FAST关键点检测和BRIEF关键点描述符的结合体, 并很多修改增强了性能。 先它使用 FAST 找到关键点, 然后再使用 Harris  角点检测对 这些关键 点进行  排序找到其中的前 N 个点。它也使用 金字塔从而产生尺度不变性特征。

 数据的方差大的一个好处是 使得特征更容易分辨。

对于描述符,ORB使用BRIEF描述符。但我们已经看到,这个BRIEF的表现在旋转方面表现不佳。因此,ORB所做的是根据关键点的方向来“引导”。
对于在位置(xi,yi)的n个二进制测试的任何特性集,定义一个包含这些像素坐标的2 n矩阵。然后利用补丁的方向,找到旋转矩阵并旋转S,以得到引导(旋转)版本s。

ORB将角度进行离散化,以增加2/30(12度),并构造一个预先计算过的简短模式的查找表。只要键点的方向是一致的,就会使用正确的点集来计算它的描述符。

BRIEF有一个重要的属性,即每个比特的特性都有很大的方差,而平均值接近0.5。但是一旦它沿着键点方向移动,它就会失去这个属性并变得更加分散。高方差使特征更有区别,因为它对输入的响应不同。另一个可取的特性是让测试不相关,因为每个测试都将对结果有所贡献。为了解决所有这些问题,ORB在所有可能的二进制测试中运行一个贪婪的搜索,以找到那些既有高方差又接近0.5的,同时又不相关的。结果被称为rBRIEF。

对于描述符匹配,在传统的LSH上改进的多探测LSH是被使用的。这篇文章说,ORB比冲浪快得多,而且比冲浪还好。对于全景拼接的低功率设备,ORB是一个不错的选择。

二、OpenCV中的ORB
使用函数cv.ORB_create()创建一个ORB对象,它有几个可选参数。最有用的应该是nfeature,默认值为500,它表示了要保留特征的最大数目。scoreType设置使用Harris打分还是使用FAST打分对特征进行排序(默认使用Harris打分)。参数WTA_K决定了产生每个oriented_BRIEF描述符要使用的像素点的数目,默认值是2,也就是一次选择两个点。在这种情况下进行匹配,要使用NORM_HAMMING距离。如果WTA_K被设置成3或4,那匹配距离就要设置为NORM_HAMMING2。

三、具体代码
 
  
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt


img = cv.imread('img/blox.jpg')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

orb = cv.ORB_create()

kp= orb.detect(gray, None)
kp, des = orb.compute(gray, kp)
img2 = cv.drawKeypoints(img, kp, None, (255, 0, 0), flags=0)
'''
For Python API, flags are modified as cv2.DRAW_MATCHES_FLAGS_DEFAULT,
    .   cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS, cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG,
    .   cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS
'''
cv.imshow('image', img2)

cv.namedWindow('img',cv.WINDOW_AUTOSIZE)
cv.imshow('img',img)
cv.waitKey(0)
cv.destroyAllWindows()


猜你喜欢

转载自blog.csdn.net/qq_36387683/article/details/80576225