OpenCV: 特徴点/特徴量の抽出

Takami Torao OpenCV 3 Python 3 #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) 座標で表したものである。拡大/縮小や回転に不変な特徴とした行列を算出することができる。