Python+OpenCV|ハリスコーナ検出器

ハリスコーナ検出器

大まかな手順

  1. 画像の平滑化
  2. 各画素の微分を計算する
  3. 行列M(後述)を計算する
  4. コーナネスC(後述)を計算する
  5. コーナネスCの値が閾値より大きければ、コーナと判定する

行列Mは次のように設定する。
$$M = \sum \omega (x,y) \begin{pmatrix} I_x^2 & I_xI_y \\ I_xI_y & I_y^2 \end{pmatrix}$$

コーナネスCは次のように設定する。
$$C = \mathrm{ det }(M) – k(\mathrm{ Tr } (M))^2$$
kはパラメータである。
kは、0.04~0.06の数値がよく用いられる。

$$\mathrm{ det }(M) = \lambda_1 \lambda_2$$
$$\mathrm{ Tr } (M) = \lambda_1 + \lambda_2$$

λは、行列Mの固有値

Python+OpenCV

OpenCVの関数cornerHarris()を使用する。

引数が、

  1. 入力画像
  2. コーナー検出の際に考慮する隣接領域のサイズ
  3. Sobelの勾配オペレータのカーネルサイズ
  4. k-パラメータ

kパラメータは、0.04から0.06の数値がよく使われる。

import cv2
import numpy as np

img = cv2.imread('haruna_kankore.png')
gray = cv2.imread('haruna_kankore.png', 0)

gray = np.float32(gray)

dst = cv2.cornerHarris(gray,2,3,0.06)

dst = cv2.dilate(dst,None)

#閾値の設定
img[dst>0.01*dst.max()]=[0,0,255]
cv2.imwrite('Harris.png', dst)
cv2.imwrite('Harris_corner.png',img)

出力画像

元画像

ハリスコーナ検出

参考

http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_feature2d/py_features_harris/py_features_harris.html

おすすめ