魏老师学生——Cecil:学习OpenCV-机器视觉之旅

  • 原理
  • OpenCV中的ORB算法
  • 代码演示


原理

  1. ORB算法来自OpenCV_Labs,在计算开支、匹配效率以及专利问题方面可以替代SIFT和SURF算法。
  2. ORB算法是FAST关键点检测和BRIEF关键点描述器的结合体,并且通过修改增强了性能。首先使用FAST找到关键点,再使用Harris角点检测对关键点排序找到其中前N个点。并使用金字塔产生尺度不变特征。
  3. 保证旋转不变性:使用灰度矩算法计算角点方向。以角点到角点所在区域质心方向为向量方向,计算以角点为中心 半径为r的圆形区域的矩 再根据矩计算出方向,以提高旋转不变性。
  4. 由于BRIEF算法对于旋转不稳定,所以在生成特征前,要把关键点邻域的特征器坐标轴旋转到关键点方向。对于在位置(xi,yi)处的n个二进制测试的特征集,通过定义一个2×n的包含像素点坐标的矩阵。然后利用补丁的方向性,找到它的旋转矩阵然后旋转角度以得到想要的版本。
  5. ORB算法通过离散角增加12°,构建BRIEF预计算模式的查找表。只要视图的关键点方向一致,就将关键点的设置用于计算描述器。
  6. BRIEF算法的均值接近0.5且方差很大,steered_BRIEF算法的均值分散(0.5,0.45,0.35等)且方差减小了。 方差数据大的好处:特征更易分辨。通过学习算法选择二进制测试的一个子集来弥补方差小的缺陷。
  7. 描述符匹配中使用对传统LSH改善后的多探针LSH。

OpenCV中的ORB算法

首先,通过cv2.ORB() feature2D通用接口创建ORB对象;
可选参数,nfeature默认值500,表示保留特征最大的数目。
scoreType设置使用Harris(默认)打分或者FAST打分对特征排序。
WTA_K决定产生每个oriented_BRIEF描述符要使用像素点的数目,默认值2,即一次选择两点。
使用NORM_HAMMING距离匹配。WTA_K设置为3或4,则为NORM_HAMMING2.

代码演示

#coding=utf-8
import cv2
import numpy as np
from matplotlib import pyplot as plt

img=cv2.imread('./image2/mario.jpg',0)
orb=cv2.ORB()
kp=orb.detect(img,None)
kp,des=orb.compute(img,kp) #计算ORB描述符

img2=cv2.drawKeypoints(img,kp,color=(0,255,0),flags=0)#只绘制关键点位置,忽略大小和方向。
plt.imshow(img2)
plt.show()