このチュートリアルでは,
前のチュートリアルではHarrisのコーナー検出を学んだ.その後1994年にJ. Shi & C. Tomasiが Good Features to Track(物体追跡によい特徴)という論文で改善案を提案した。そしてこれはHarrisのコーナー検出の結果よりも良い結果を示すものであった.
Harrisのコーナー検出の評価関数の定義は以下であった:
Shi-Tomasiのコーナー検出ではこの関数の代わりに以下を使う:
このRの値が閾値より大きければコーナーとみなす.Harrisのコーナー検出と同様に $\lambda_1 - \lambda_2$ 空間でのRの値をプロットすると,以下の図のようになる:
この図から, $\lambda_1$ と $\lambda_2$ の値が最小値 $\lambda_{min}$ 以上の時だけ,コーナー(緑色の領域)とみなされる.
OpenCVでは cv2.goodFeaturesToTrack(image, maxCorners, qualityLevel, minDistance[, corners[, mask[, blockSize[, useHarrisDetector[, k]]]]]) という関数で実装されている.Shi-Tomasiの手法(指定次第ではHarrisのコーナー検出も使える)によって画像中にスコアが高い順にN個のコーナーを検出する.普通はimage引数にグレースケール画像1枚を入力として指定し,検出するコーナーの個数(maxCorners)を指定する.次に,検出するコーナーの質レベル(qualityLevel)を0から1の間の値で指定する(この値未満のものはコーナーとして採用されない).最後に、2つのコーナー間のユークリッド距離の最小値(miniDistance)を与える.
これらの全情報によって,この関数は画像中のコーナー検出を行う.スコアが質レベルより低いコーナー候補はみな取り除かれる.スコアを基に残ったコーナーを降順でソートし,最もスコアの大きいコーナーから順にその周囲の最小のユークリッド距離以内のコーナーを取り除くことを繰り返し,最終的にN個のコーナーを返す.
次の例は25個のコーナーを見つける(コード、画像):
%matplotlib inline
import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('blox.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.figure(figsize=(10,8))
plt.imshow(img)
plt.xticks([]),plt.yticks([])
plt.show()
この関数はコーナー検出よりも物体追跡に向いている.これについては後で解説する.
Shi, J. & Tomasi, C. (1994) Good Features to Track. IEEE Conference on Computer Vision and Pattern Recognition (CVPR'94). pp.593 - 600.