6.1 特征检测算法
OpenCV中最常使用的特征检测和提取算法有:
1.
Harris: 该算法用于检测角点
2.
SIFT: 该算法用于检测斑点(blob)
3.
SURF:该算法用于检测斑点
4.
FAST:该算法用于检测角点
5.
BRIEF:该算法用于检测斑点
6.
ORB:该算法代表带方向的FAST算法与具有旋转不变性的BRIEF算法
通过以下方式进行特征匹配:
*
暴力匹配法
*
基于FLANN的匹配法
6.1.1 特征定义
特征:区域具有独特性或者易于识别性。因此,角点及高密度区域是很好的 特征,而大量重复的模式或低密度区域则不是很好的特征
使用cornerHarris( )函数检测图像的角点( 角点也是处在一个无论框框往哪边移动 框框内像素值都会变化很大)
cornerHarris参数:
src - 数据类型为 float32 的输入图像。
blockSize - 标记的大小。
ksize - Sobel 求导中使用的窗口大小
k - Harris 角点检测方程中的自由参数,取值参数为 [0,04,0.06].
dst = cv2.cornerHarris(src=gray, blockSize=2, ksize=23, k=0.04)
6.1.2 使用DoG和SIFT进行特征提取与描述
角点会受到图像大小的影响,如果减小(或增大)图像的大小,可能会丢失图像的某些部分,甚至可能增加焦点的质量。
这样的特征损失需要一种与图像比例无关的角点检测方法来解决-----尺度不变特征变换(Scale-Invariant Feature Transform,SIFT)。 SIFT特征不只具有尺度不变性,即使改变旋转角度,图像亮度或拍摄视角,仍然能够得到好的检测效果。
SIFT并不检测关键点(关键点可以由Different of Gaussians检测),但SIFT会通过一个特征向量来描述关键点周围区域的情况。
创建SIFT对象,SIFT会使用DoG检测关键点,并且对每个关键点周围的区域计算特征向量
sift = cv2.xfeatures2d.SIFT_create()
# sift = cv2.xfeatures2d.SURF_create(float(4000))
# 将图片进行SURF计算,并找出角点keypoints,keypoints是检测关键点
# descriptor是描述符,这是图像一种表示方式,可以比较两个图像的关键点描述符,可作为特征匹配的一种方法。
keypoints, descriptor = sift.detectAndCompute(gray, None)
关键点的属性:
pt: 点的x y坐标
size: 表示特征的直径
angle: 特征方向
response: 关键点的强度
octave: 特征所在金字塔层级
算法进行迭代的时候, 作为参数的图像尺寸和相邻像素会发生变化
octave属性表示检测到关键点所在的层级
ID: 检测到关键点的ID
6.1.3 使用快速Hessian算法和SURF来提取和检测特征
cv2.xfeatures2d.SURF_create()
6.1.4 基于ORB的特征检测和特征匹配
ORB基于FAST关键点检测技术和基于BRIFEF描述符的技术相结合
FAST算子的基本原理是:若某像素点与其周围领域内足够多的连续的像素点存在某一属性差异,并且该差异大于指定阈值,则可以断定该像素点与其邻域像素有可被识别的不同之处,可以作为一个特征点(角点);对于灰度图像,FAST算子考察的属性是像素与其邻域的灰度差异。
BRIEF(Binary Robust Independent Elementary Features)并不是特征检测算法,它只是一个描述符。
检测结果是一组关键点,计算结果是描述符。这意味着OpenCV的SIFT类和SURF类既是检测器也是描述符(尽管算法本身并不是这样的!OpenCV的SIFT是DoG和SIFT的组合,SURF是快速Hessian和SURF的组合)。
暴力(Brute-Force)匹配方法是一种描述符匹配方法,该方法会比较两个描述符,并产生匹配结果的列表。称为暴力匹配的原因是该算法基本上不涉及优化,第一个描述符的所有特征都用来和第二个描述符的特征进行比较。每次比较都会给出一个距离值,而最好的比较结果会被认为是一个匹配。
6.1.5 ORB特征匹配
orb = cv2.ORB_create() # 创建ORB检测器,用于检测计算关键点和描述符
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) # 获得暴力匹配检测器
matches = bf.match(desc1, desc2) # 进行匹配
6.1.6 K-最近邻匹配
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) # 获得暴力匹配检测器
matches = bf.knnMatch(desc1, desc2, k=1) #KNN匹配
6.1.7 FLANN匹配
kdtree建立索引方式的常量参数
FLANN_INDEX_KDTREE = 0
indexParams = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
searchParams = dict(checks=50) # checks指定索引树要被遍历的次数
# 获取flann匹配器3
6.1.8 FLANN的单应性匹配
单应性指的是图像在投影发生了 畸变后仍然能够有较高的检测和匹配准确率