目录
1.安装opencv-contrib-python
首先要安装opencv-contrib-python,否则会提示如下错误:
Traceback (most recent call last):
File "sift.py", line 7, in <module>
sift = cv2.xfeatures2d.SIFT_create()
AttributeError: module 'cv2.cv2' has no attribute 'xfeatures2d'
安装时要注意,opencv-contrib-python的3.4.2及以下版本是包含sift的,3.4.3及以上版本不包含sift,我这里安装的是opencv-contrib-python的3.4.2.17版本,
安装命令如下
#卸载opencv-python
pip uninstall opencv-python
#安装opencv-contrib-python
pip install opencv-contrib-python==3.4.2.17
2.sift关键点检测
代码如下:
#coding = utf8
import cv2
import numpy as np
img = cv2.imread('./0.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
sift = cv2.xfeatures2d.SIFT_create()
kp = sift.detect(gray, None)
img = cv2.drawKeypoints(gray, kp, img)
#cv2.imshow('sp', img)
#cv2.waitKey(0)
cv2.imwrite("./result.jpg", img)
原图和结果图如下:
3.sift特征匹配
import io
from PIL import Image, ImageTk
import tkinter as tk
import cv2
import numpy as np
MIN_MATCH_COUNT = 4
img1 = cv2.imread("./ai0.jpeg")
img2 = cv2.imread("./ai1.jpeg")
g1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
g2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
sift = cv2.xfeatures2d.SIFT_create()
match = cv2.FlannBasedMatcher(dict(algorithm =2, trees =1), {})
kp1, de1 = sift.detectAndCompute(g1,None)
kp2, de2 = sift.detectAndCompute(g2,None)
m = match.knnMatch(de1, de2, 2)
m = sorted(m,key = lambda x:x[0].distance)
ok = [m1 for (m1, m2) in m if m1.distance < 0.7 * m2.distance]
med = cv2.drawMatches(img1, kp1, img2, kp2, ok, None)
cv2.imwrite("./match.jpg", med)
原图如下:
结果如下: