OpenCV: 特徴点/特徴量の抽出
特徴点の抽出
コマンドラインで指定された画像から特徴点 (keypoint) を抽出して表示する。
import cv2
import sys
import os
# 画像から特徴点を抽出し表示するサンプル
def keypoint(file):
detector = cv2.KAZE_create()
gray = cv2.imread(file, cv2.IMREAD_GRAYSCALE)
if gray is not None:
keypoints = detector.detect(gray)
# keypoints, descriptions = detector.detectAndCompute(gray, None)
# print(len(descriptions))
# print(len(descriptions[0]))
# for d in descriptions[:10]:
# print("(%s, ..., %s)" % (", ".join(map(lambda x: "%.2f" % x, d[:4])), "%.2f" % d[-1]))
return plot_keypoints(cv2.imread(file, cv2.IMREAD_UNCHANGED), keypoints)
else:
print("ERROR: file not found or not a image: %s" % file)
return None
def plot_keypoints(image, keypoints):
for keypoint in keypoints:
x, y = keypoint.pt
cv2.circle(image, (int(x), int(y)), 3, (44, 33, 223), 1, 16)
return image
if __name__ == "__main__":
file = sys.argv[1]
result = keypoint(file)
if result is not None:
basename, ext = os.path.splitext(file)
cv2.imwrite(basename + "_fp" + ext, result)
cv2.imshow("keypoint", result)
cv2.waitKey(0)
cv2.destroyAllWindows()
上記のコードでは KAZE を使用しているが他にも Feature2D
サブクラスに実装されているアルゴリズムを使用することができる。
$ python keypoint.py mushroom.jpg
特徴ベクトルの算出
特徴点に基づいて特徴点は画像の上でどこに特徴 (角や点など) があるかを (x,y) 座標で表したものである。拡大/縮小や回転に不変な特徴とした行列を算出することができる。