OpenCV による特徴点のマッチング (Python)
[履歴] [最終更新] (2020/02/24 01:31:54)

特徴点の検出 Feature Detection

特徴点として利用できるものの一つに、物体の角があります。角を検出するアルゴリズムの一つに Harris Corner Detection があります。分かりやすさのため、モルフォロジー変換で「角」を膨張させています。

Uploaded Image

#!/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 Matching

特徴点に対する特徴記述子 Feature Description を計算して、それぞれの画像で計算結果を比較してマッチングします。マッチング結果は、例えばパノラマ画像の作成などに利用できます。

Uploaded Image

Uploaded Image

#!/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)
関連ページ
    概要 カメラキャリブレーション (Camera Calibration, Camera Resectioning) を行うと、レンズの歪みを表現するパラメータや、カメラのワールド座標系での位置姿勢を推定できます。 チェスボードのようなキャリブレーション専用のボードが利用されます。 キャリブレーションで得られたパラメータを用いると、例えば歪みを補正することができます。
    概要 OpenCV を用いて、複数の画像から一枚のパノラマ画像を作成します。内部パラメータが分かっているカメラを位置を変えずに回転させて画像を取得していき、各画像を取得した時点でのカメラの向きをもとに画像を重ね合わせる方法と、各画像における特徴点が一致するように画像を重ね合わせる方法の二つについて記載します。 キャリブレーションされたカメラを定位置で回転させる方法
    概要 特徴点が分かっている既知の物体については、単一カメラを用いて位置姿勢が推定できます。物体や全体のシーンが未知である場合は、例えばステレオ形式のカメラ二つを用いることで同様の結果を得ます。具体的には、距離情報を濃淡として保存した距離画像 (Depth Map; 奥行きマップ) を作成します。 エピポーラ幾何について