opencv-098-SIFT特征提取之关键点提取

知识点

SIFT特征提取是图像特征提取中最经典的一个算法,归纳起来SIFT特征提取主要有如下几步:

  • 构建高斯多尺度金字塔
  • 关键点查找/过滤与精准定位
  • 窗口区域角度方向直方图
  • 描述子生成

OpenCV已经实现了SIFT算法,但是在OpenCV3.0之后因为专利授权问题,该算法在扩展模块xfeature2d中,需要自己编译才可以使用,OpenCV Python中从3.4.2之后扩展模块也无法使用,需要自己单独编译python SDK才可以使用。其使用方法与我们前面介绍的ORB完全一致。都是遵循下面的步骤

  1. 创建对象
  2. 通过detect方法提取对象关键点
  3. 同drawKeypoints绘制关键点

构建多尺度高斯金字塔
为了在每组图像中检测 S 个尺度的极值点,DoG 金字塔每组需 S+2 层图像,因为每组的第一层和最后一层图像上不能检测极值,DoG 金字塔由高斯金字塔相邻两层相减得到,则高斯金字塔每组最少需 S+3 层图像,实际计算时 S 通常在2到5之间。

代码(python)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
"""
SIFT特征提取之关键点提取
"""

import cv2 as cv

src = cv.imread("images/test4.jpg")
cv.imshow("input", src)

# 需要编译才能使用
sift = cv.xfeatures2d.SIFT_create()
kps = sift.detect(src)
# opencv4 python版中好像没有 cv.drawKeypoints()
# result = cv.drawKeypoints(src, kps, None, (0, 255, 0), cv.DrawMatchesFlags_DEFAULT)
result = src.copy()
for marker in kps:
result = cv.drawMarker(src, tuple(int(i) for i in marker.pt), color=(0, 255, 0))

cv.imshow("result", result)
cv.waitKey(0)
cv.destroyAllWindows()

结果

代码地址

github