OpenCV 4.13.0
Open Source Computer Vision
読み込み中...
検索中...
見つかりません
🤖 AIによる機械翻訳(非公式) — これは OpenCV 4.13.0 公式リファレンス(英語)を AI (Claude) で自動翻訳したものです。訳に誤りを含む場合があります。正確な情報は 公式英語版(原文) を参照してください。
Shi-Tomasiコーナー検出と追跡に適した特徴

目標

本章では、

  • もう1つのコーナー検出器である Shi-Tomasi コーナー検出器について学ぶ
  • 次の関数を扱う: cv.goodFeaturesToTrack()

理論

前章では Harris コーナー検出器を見た。その後1994年に、J. Shi と C. Tomasi は論文 Good Features to Track の中でそれに小さな変更を加え、Harris コーナー検出器と比べてより良い結果を示した。Harris コーナー検出器におけるスコア関数は次のように与えられていた:

\[R = \lambda_1 \lambda_2 - k(\lambda_1+\lambda_2)^2\]

その代わりに、Shi-Tomasi は次を提案した:

\[R = \min(\lambda_1, \lambda_2)\]

これがしきい値より大きければ、コーナーとみなされる。Harris コーナー検出器で行ったように \(\lambda_1 - \lambda_2\) 空間にプロットすると、以下のような画像が得られる:

image

図から分かるように、\(\lambda_1\) と \(\lambda_2\) がともに最小値 \(\lambda_{\min}\) を超えている場合に限り、コーナー(緑の領域)とみなされる。

コード

OpenCV には cv.goodFeaturesToTrack() という関数がある。これは Shi-Tomasi 法(または指定すれば Harris コーナー検出)によって、画像中の最も強いN個のコーナーを見つける。通常どおり、画像はグレースケール画像である必要がある。次に、見つけたいコーナーの数を指定する。そして品質レベルを指定する。これは0から1の間の値で、これを下回るコーナーはすべて棄却されるコーナー品質の下限を表す。さらに、検出されるコーナー間の最小ユークリッド距離を与える。

これらの情報をすべて使って、関数は画像中のコーナーを見つける。品質レベルを下回るコーナーはすべて棄却される。次に、残ったコーナーを品質に基づいて降順にソートする。続いて、関数は最初の最も強いコーナーを取り、最小距離の範囲内にある近傍のコーナーをすべて破棄し、最も強いN個のコーナーを返す。

以下の例では、最良の25個のコーナーを見つけてみる:

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('blox.jpg')
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
corners = cv.goodFeaturesToTrack(gray,25,0.01,10)
corners = np.int0(corners)
for i in corners:
x,y = i.ravel()
cv.circle(img,(x,y),3,255,-1)
plt.imshow(img),plt.show()
Mat imread(const String &filename, int flags=IMREAD_COLOR_BGR)
Loads an image from a file.
void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0, AlgorithmHint hint=cv::ALGO_HINT_DEFAULT)
Converts an image from one color space to another.
void circle(InputOutputArray img, Point center, int radius, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0)
Draws a circle.
void goodFeaturesToTrack(InputArray image, OutputArray corners, int maxCorners, double qualityLevel, double minDistance, InputArray mask=noArray(), int blockSize=3, bool useHarrisDetector=false, double k=0.04)
Determines strong corners on an image.

以下の結果を参照のこと。

image

この関数はトラッキングにより適している。それについては時が来たときに見ていく。