In [16]:
%matplotlib inline
import numpy as np
import cv2
from matplotlib import pyplot as plt

img1 = cv2.imread('Figs/box.png',0)          # queryImage
img2 = cv2.imread('Figs/box_in_scene.png',0) # trainImage

# SIFT検出器を始める
sift = cv2.xfeatures2d.SIFT_create()

# SIFTでキーポイントと特徴記述子を求める
kp1, des1 = sift.detectAndCompute(img1,None)
kp2, des2 = sift.detectAndCompute(img2,None)

# デフォルトのパラメタを使ったBFMatcher
bf = cv2.BFMatcher()
matches = bf.knnMatch(des1,des2, k=2)

# 割合試験を適用
good = []
for m,n in matches:
    if m.distance < 0.75*n.distance:
        good.append([m])

# cv2.drawMatchesKnn はmatchesとしてリストを期待
img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good, None,flags=2)

plt.figure(figsize=(20,14))
plt.imshow(img3),plt.show()
Out[16]:
(<matplotlib.image.AxesImage at 0x7fe1034867b8>, None)
In [37]:
%matplotlib inline
import numpy as np
import cv2
from matplotlib import pyplot as plt

img1 = cv2.imread('Figs/box.png')          # queryImage
img2 = cv2.imread('Figs/box_in_scene.png') # trainImage

# A-KAZE検出器の生成
akaze = cv2.AKAZE_create()                                

# 特徴量の検出と特徴量ベクトルの計算
kp1, des1 = akaze.detectAndCompute(img1, None)
kp2, des2 = akaze.detectAndCompute(img2, None)

# Brute-Force Matcher生成
bf = cv2.BFMatcher()

# 特徴量ベクトル同士をBrute-Force&KNNでマッチング
matches = bf.knnMatch(des1, des2, k=2)

# データを間引きする
ratio = 0.75
good = []
for m, n in matches:
    if m.distance < ratio * n.distance:
        good.append([m])

# 対応する特徴点同士を描画
img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, good, None, flags=2)

# 画像表示

plt.figure(figsize=(20,14))
plt.imshow(img3)
plt.show()