OpenCV学习笔记-SIFT

一、原理
参考大神的博客,介绍的非常详细 SIFT算法详解
二、函数介绍

opencv 3.x中的部分函数有改变:SIFT、SURF等都在cv.xfeatures2d模块中

函数sift.detect()可以在图像中找到关键点。如果想在图像中的一个区域搜索的话,可以创建一个掩模图像作为参数使用。返回的关键点是个带有很多不同属性的特殊结构体,这些属性如下:

pt:    表示图像中关键点的X坐标和Y坐标
size:    表示特征的直径
angle:表示特征的方向
response:表示关键点的强度。某些特征会通过SIFT来分类,因为它得到的特征比其他特征更好,通过查看response属性可以评估特征强度
octave:表示特征所在金字塔的层级。SIFT算法与人脸检测算法类似,即只通过改变计算参数来依次处理相同的图像。例如算法在每次迭代(octave)时,作为参数的图像尺寸和相邻像素都会发生变化,因此octave属性表示的是检测到的关键点所在的层级。
class_id:    表示关键点的ID

当我们找到了关键点,我们可以使用函数sift.compute()来计算这些关键点的描述符。
kp = sift.detect(gray, None)
kp, des = sift.compute(gray, kp)

当然还可以使用函数sift.detectAndCompute()一步到位,直接找到关键点并计算出其描述符
kp, des = sift.detectAndCompute(gray, None)

kp 是一个关键点列表。des是一个numpy数组,其大小是关键的数目乘以128.

opencv也提供了绘制关键点的函数cv2.drawKeyPoints(),它可以在关键点的部位绘制一个小圆圈。如果设置了参数为cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS,就会绘制代表关键点大小的圆圈甚至可以绘制关键点的方向。

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


img = cv.imread('img/home.jpg')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
sift = cv.xfeatures2d_SIFT.create()

#两种写法
kp, des = sift.detectAndCompute(gray, None)
#kp是一个关键点列表
#des是一个numpy数组,其大小是关键点数目乘以128
# kp = sift.detect(gray, None)
# kp, des = sift.compute(gray, kp)
print(des)
kp_image = cv.drawKeypoints(gray, kp, None, flags=cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv.imshow('image', kp_image)

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

效果

猜你喜欢

转载自blog.csdn.net/qq_36387683/article/details/80559237
今日推荐