OpenCV - SIFT/SURF Python
1.OpenCV中使用SIFT首先安裝的包:
打開終端安裝:sudo pip install opencv-contrib-python==3.4.2.16 新版的opencv可能沒有xfeatures2d。
2. SIFT提取特徵:用於檢測斑點,使用difference of Gaussians(DoG)
import cv2
from matplotlib import pyplot as plt
path = '9.jpg'
img = cv2.imread(path)
img1 = cv2.imread(path)
plt.imshow(img) #圖1
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
sift = cv2.xfeatures2d.SIFT_create()
#得到特徵點
keypoints, descriptor = sift.detectAndCompute(gray, None)
img = cv2.drawKeypoints(image=img1, outImage=img, keypoints=keypoints, flags = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS, color=(51, 163, 236))
plt.imshow(img) #圖2
img = cv2.drawKeypoints(image=img1, outImage=img, keypoints=keypoints, flags = cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG, color=(51, 163, 236))
plt.imshow(img) #圖3
img = cv2.drawKeypoints(image=img1, outImage=img, keypoints=keypoints, flags = cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS, color=(51, 163, 236))
plt.imshow(img) #圖4
img = cv2.drawKeypoints(image=img1, outImage=img, keypoints=keypoints, flags = cv2.DRAW_MATCHES_FLAGS_DEFAULT, color=(51, 163, 236))
plt.imshow(img) #圖5
圖2-5主要是改變了cv2.drawKeypoints()中的flags的參數,不同的參數表示不同的顯示效果
flags = cv2.DRAW_MATCHES_FLAGS_DEFAULT:創建輸出圖像矩陣,使用現存的輸出圖像繪製匹配對和特徵點,對每一個關鍵點只繪製中間點
flags = cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG:不創建輸出圖像矩陣,而是在輸出圖像上繪製匹配對
flags = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS:對每一個特徵點繪製帶大小和方向的關鍵點圖形
flags = cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS:單點的特徵點不被繪製
color 表示標註的顏色
圖1
圖2
圖3
圖4
圖5
3.SURF檢測斑點,使用Hessian算法
surf = cv2.xfeatures2d.SURF_create()
keypoints, descriptor = surf.detectAndCompute(gray, None)
img = cv2.drawKeypoints(image=img1, outImage=img, keypoints=keypoints, flags = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS, color=(51, 163, 236))
plt.imshow(img) #圖6
img = cv2.drawKeypoints(image=img1, outImage=img, keypoints=keypoints, flags = cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG, color=(51, 163, 236))
plt.imshow(img)
img = cv2.drawKeypoints(image=img1, outImage=img, keypoints=keypoints, flags = cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS, color=(51, 163, 236))
plt.imshow(img)
img = cv2.drawKeypoints(image=img1, outImage=img, keypoints=keypoints, flags = cv2.DRAW_MATCHES_FLAGS_DEFAULT, color=(51, 163, 236))
plt.imshow(img)
圖6