特徴点として利用できるものの一つに、物体の角があります。角を検出するアルゴリズムの一つに Harris Corner Detection があります。分かりやすさのため、モルフォロジー変換で「角」を膨張させています。
#!/usr/bin/python
# -*- coding: utf-8 -*-
import numpy as np
import cv2 as cv
# 画像の読み込み
img = cv.imread('aaa.png')
# グレースケール変換
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 特徴点として扱いやすい「角」を計算
dst = cv.cornerHarris(gray.astype(np.float32), 2, 3, 0.04)
# 分かりやすさのため、モルフォロジー変換で「角」を膨張させます。
dst_dilated = cv.dilate(dst, None)
# もとの画像に赤い点として描画します。
img[dst_dilated > 0.01 * dst_dilated.max()] = [0, 0, 255]
# 描画してみます。
cv.normalize(dst, dst, 0, 255, cv.NORM_MINMAX)
cv.normalize(dst_dilated, dst_dilated, 0, 255, cv.NORM_MINMAX)
cv.imshow('dst', dst.astype(np.uint8))
cv.imshow('dst_dilated', dst_dilated.astype(np.uint8))
cv.imshow('img', img)
cv.waitKey(0)
特徴点に対する特徴記述子 Feature Description を計算して、それぞれの画像で計算結果を比較してマッチングします。マッチング結果は、例えばパノラマ画像の作成などに利用できます。
#!/usr/bin/python
# -*- coding: utf-8 -*-
import numpy as np
import cv2 as cv
# 画像を読み込みます
img1 = cv.imread('aaa.png')
img2 = cv.imread('fff.png')
# グレースケール変換
gray1 = cv.cvtColor(img1, cv.COLOR_BGR2GRAY)
gray2 = cv.cvtColor(img2, cv.COLOR_BGR2GRAY)
# ORB detector で特徴点 (keypoints) と特徴量 (descriptors) を計算します。
orb = cv.ORB_create()
kp1, des1 = orb.detectAndCompute(gray1, None)
kp2, des2 = orb.detectAndCompute(gray2, None)
# 総当たりで特徴量をマッチングします。
bf = cv.BFMatcher(cv.NORM_HAMMING, crossCheck=True)
matches = bf.match(des1, des2)
# より良くマッチした 10 の特徴点を可視化してみます。
matches = sorted(matches, key = lambda x:x.distance)
dst = cv.drawMatches(img1, kp1, img2, kp2, matches[:10], None, flags=2)
cv.imshow('dst', dst)
cv.waitKey(0)