Shi-Tomasiのコーナー検出とGood Features to Track(追跡に向いた特徴)¶
理論¶
前チュートリアルではHarrisのコーナー検出について学びました.その後1994年にJ. ShiとC. Tomasiらが Good Features to Track という論文で発表した改善案はHarrisのコーナー検出の結果より良い結果を示します.
Harrisのコーナー検出での評価関数は以下のように定義されます:
この関数の代わりに,Shi-Tomasiのコーナー検出では:
このRの値が閾値より大きければコーナーとみなします.Harrisのコーナー検出と同様に 空間でのRの値をプロットすると,以下の図のようになります:
図より, と
の値が最小値
以上の時のみ,コーナー(緑色の領域)とみなされます.
コード¶
OpenCVでは cv2.goodFeaturesToTrack() という関数で実装されています.Shi-Tomasiの手法(指定次第ではHarrisのコーナー検出も使えます)によって画像中のN個のスコアが高いコーナーを検出します.普通はグレースケール画像1枚を入力とし,検出したいコーナーの数を指定します.次に,検出するコーナーの最低限の質を指定する質レベルを0から1の間の値で指定します.最後に検出される2つのコーナー間の最低限のユークリッド距離を与えます.
指定したこれらの全情報を使い,画像中のコーナー検出を行います.スコアが質レベルより低い全コーナーが取り除かれます.閾値処理で残ったコーナーは,スコアを基に降順でソートされます.次に,最もスコアの大きいコーナーの周囲のコーナーを取り除き,最終的にスコアが高いN個のコーナーのみが残ります.
以下の例では25個のコーナーを見つけます:
import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('simple.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
corners = cv2.goodFeaturesToTrack(gray,25,0.01,10)
corners = np.int0(corners)
for i in corners:
x,y = i.ravel()
cv2.circle(img,(x,y),3,255,-1)
plt.imshow(img),plt.show()
See the result below:
この関数は物体追跡等により有用です.そのうち,必要な時に説明します.