实现步骤
-
cv2.xfeatures2d.SIFT_create
(实例化sift) -
sift.detect
(找出关键点) -
cv2.drawKeypoints
(画出关键点) -
sift.compute
(根据关键点计算sift向量)
参数
sift = cv2.xfeatures2d.SIFT_create()
参数说明:sift为实例化的sift函数
kp = sift.detect(gray, None)
参数说明: kp表示生成的关键点,gray表示输入的灰度图,
ret = cv2.drawKeypoints(gray, kp, img)
参数说明:gray表示输入图片, kp表示关键点,img表示输出的图片
kp, dst = sift.compute(kp)
参数说明:kp表示输入的关键点,dst表示输出的sift特征向量,通常是128维的
代码
import cv2
import numpy as np
img = cv2.imread('image.jpg')
gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
sift = cv2.xfeatures2d.SIFT_create() #sifi
kp = sift.detect(gray,None) #找到关键点
cv2.drawKeypoints(gray,kp,img) #绘制关键点
cv2.imshow("img",img)
cv2.waitKey()
cv2.destroyAllWindows()
在drawKeypoints
函数里设置参数为cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS
就会绘制代表关键点大小的圆圈甚至可以绘制除关键点的方向。
cv2.drawKeypoints(gray,kp,img,flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) #绘制关键点
使用关键点找出sift特征向量
kp, des = sift.compute(gray, kp)
print(np.shape(kp))
print(np.shape(des))
print(des[0])
SURF
SURF(加速稳健特征)算法。跟它的名字一样,这是个算法是加速版的 SIFT。
import cv2
import numpy as np
img = cv2.imread('image.jpg')
gray= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
surf = cv2.xfeatures2d.SURF_create(7000) #SURF Hessian 的阈值
kp, des = surf.detectAndCompute(img,None) #寻找关键点
print( len(kp)) #打印关键点个数
cv2.drawKeypoints(img,kp,img,flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) #绘制关键点
cv2.imshow("img",img)
cv2.waitKey()
cv2.destroyAllWindows()
29