【OpenCV--关键点检测】

时间:2022-10-31 11:53:43

目录

一、SIFT算法

1.描述:

2.实现:

3.示例:

 二、FAST算法

1.描述:

2.实现:

3.示例:

 三、ORB算法

1.描述:

2.实现:

3.示例:


一、SIFT算法

1.描述:

Harris和Shi-Tomasi角点检测具有旋转不变性,但是都不具有尺度不变性,当图象被放大后,使用同样的窗口,就会检测不到角点,此时需要尺度不变特征转换即SIFT算法,分为以下四步:

1>尺度空间极值检测:搜索所有尺度上的图像位置。通过高斯差分函数来识别潜在的对于尺度和旋转不变的关键点,一个图像的尺度空间L(x,y,【OpenCV--关键点检测】),定义为原始图像I(x,y)与一个可变尺度的2维高斯函数G(x,y,【OpenCV--关键点检测】)卷积运算
2>关键点定位:在每个候选的位置上,通过一个拟合精细的模型来确定位置和尺度,关键点的选择依据于它们的稳定程度。
3>关键点方向确定:基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向, 所有后面的对图像数据的操作都相对于关键点的方向、尺度和位置进行变换,从而保证了对于这些变换的不变性。
4>关键点描述:在每个关键点周围的邻域内,在选定的尺度上测量图像局部的梯度,这些梯度作为关键点的描述符,它允许比较大的局部形状的变形或光照变化。

2.实现:

1>实例化sift

sift=cv.xfeatures2d.SIFT_create()

2>利用sift.detectAndCompute()检测关键点并计算

kp,des=sift.detectAndCompute(gray,None)

参数:

kp:关键点信息,包括位置、尺度、方向信息

des:关键点描述符,每个关键点对应128个梯度信息的特征向量

3>将关键点检测结果绘制在图像上

cv.drawKeypoints(image,keypoints,outputimage,color,flags)

参数;

keypoints:关键点信息

outputimage:输出图片,可以是原始图像

color:通过修改(B,G,R)的值

flags:绘图功能的标识设置

flags相关参数 描述
cv.DRAW_MATCHES_FLAGS_DEFAULT 创建输出图像,使用现存输出图像绘制匹配对和特征点,对每一个关键点只绘制中间点
cv.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG 不创建输出图像矩阵,在输出图像上绘制匹配对
cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS 对每一个特征点绘制带大小和方向的关键点图形
cv.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS 单点的特征点不被绘制

3.示例:

import numpy as np
import matplotlib.pyplot as plt
import cv2 as cv
img=cv.imread('building.jpg')
gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
sift=cv.xfeatures2d.SIFT_create()
kp,des=sift.detectAndCompute(gray,None)
cv.drawKeypoints(img,kp,img,flags=cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
plt.imshow(img[:,:,::-1])
plt.show()

【OpenCV--关键点检测】

 二、FAST算法

1.描述:

FAST算法是一种用于角点检测的算法,该算法原理是提取图像中检测点,以该点为圆心的周围邻域内像素点判断检测点是否为角点,即若有一个像素周围有一定数量的像素与该点像素值不同,则认为其是角点,流程如下:

1.在图像中选取一个像素点p,来判断它是不是关键点,Ip等于像素点p的灰度值。
2.以r为半径画圆,覆盖p点周围的M个像素,通常情况下,设置r=3,则M=16,如下图所示:

【OpenCV--关键点检测】
3.设置一个阈值t,如果在这16个像素点中存在n个连续像素点的灰度值都高于Ip + t,或者低于Ip-t,那么像素点p就被认为是一个角点。如上图中的虚线所示,n一般取值为12。
4.由于在检测特征点时是需要对图像中所有的像素点进行检测,然而图像中的绝大多数点都不是特征点,此时会浪费许多时间,因此采用进行非特征点判别的方法:首先对候选点的周围每个90度的点: 1, 9, 5, 13 进行测试(先测试1和19,如果它们符合阈值要求再测试5和13)如果p是角点,那么这四个*至少有3个要符合阈值要求,否则剔除,再对剩下进行检测

2.实现:

1>实例化fast:

fast=cv.FastFeatureDetector_create(threshold,nonmaxSuppression)

threshold:阈值,默认10

nonmaxSuppression:进行非极大值抑制,默认True

2>利用fast.detect()检测关键点

kp=fast.detect(gray,None) #没有关键点描述

3>将关键点绘制在图像上

cv.drawKeypoints(image,keypoints,outputimage,color,flags)

3.示例:

import numpy as np
import matplotlib.pyplot as plt
import cv2 as cv
img=cv.imread('building.jpg')
gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
fast=cv.FastFeatureDetector_create(threshold=30)
kp=fast.detect(img,None)
img2=cv.drawKeypoints(img,kp,None,color=(0,0,255))
plt.imshow(img2[:,:,::-1])
plt.show()

【OpenCV--关键点检测】

 三、ORB算法

1.描述:

ORB算法提出构造金字塔,为fast特征点添加了方向,使关键点具有尺度不变性和旋转不变性,改进了 Brief算法,Brief描述子不具备旋转不变性,理想的特征点描述子应该具备旋转不变性,使得图像在经过一定的旋转后仍然能够识别匹配其中的特征点,ORB算法解决了旋转一致性问题

2.实现:

1>实例化orb:

orb=cv.ORB_create(nfeatures)

nfearures:特征点最大数量

2>利用orb.detectAndCompute()进行关键点检测

kp,des=orb.detectAndCompute(gray,None)

3>将关键点检测结果绘制在图像上

cv.drawKeypoints(image,keypoints,outputimage,color,flags)

3.示例:

import numpy as np
import matplotlib.pyplot as plt
import cv2 as cv
img=cv.imread('building.jpg')
gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
orb=cv.ORB_create(nfeatures=4000)
kp,des=orb.detectAndCompute(img,None)
img2=cv.drawKeypoints(img,kp,None,color=(0,255,0))
plt.imshow(img2[:,:,::-1])
plt.show()

【OpenCV--关键点检测】