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

次のチュートリアル: Shi-Tomasiコーナー検出器

原著者Ana Huamán
互換性OpenCV >= 3.0

目的

このチュートリアルでは以下を学ぶ:

  • 特徴とは何か、そしてなぜそれが重要なのか
  • Harris-Stephens法を用いてコーナーを検出するために、関数 cv::cornerHarris を使用する。

理論

特徴とは何か?

  • コンピュータビジョンでは、ある環境の異なるフレーム間で対応する点を見つける必要があることが多い。なぜか? 2つの画像が互いにどう関係しているかが分かれば、両方の画像を使ってそれらから情報を抽出できるからである。
  • 対応点と言うとき、一般的な意味では、容易に認識できるシーン中の特性を指している。これらの特性を特徴と呼ぶ。
  • So, what characteristics should a feature have?
    • それは一意に認識可能でなければならない

画像特徴の種類

いくつか挙げると:

  • エッジ
  • コーナー (関心点とも呼ばれる)
  • ブロブ (関心領域とも呼ばれる)

このチュートリアルでは、特にコーナー特徴について学ぶ。

なぜコーナーは特別なのか?

  • なぜなら、コーナーは2つのエッジの交点であり、これら2つのエッジの方向が変化する点を表しているからである。したがって、(両方向における)画像の勾配は大きく変動し、これを利用してコーナーを検出できる。

どのように動作するのか?

  • コーナーを探してみよう。コーナーは画像内の勾配の変動を表すので、この「変動」を探すことにする。
  • グレースケール画像 \(I\) を考える。ウィンドウ \(w(x,y)\) を (x方向に \(u\)、y方向に \(v\) だけ変位させながら) \(I\) 上で走査し、輝度の変動を計算する。

    \[E(u,v) = \sum _{x,y} w(x,y)[ I(x+u,y+v) - I(x,y)]^{2}\]

    ここで:

    • \(w(x,y)\) は位置 \((x,y)\) におけるウィンドウである
    • \(I(x,y)\) は \((x,y)\) における輝度である
    • \(I(x+u,y+v)\) は移動後のウィンドウ \((x+u,y+v)\) における輝度である
  • コーナーを含むウィンドウを探しているので、輝度の変動が大きいウィンドウを探している。したがって、上式、特に次の項を最大化しなければならない:

    \[\sum _{x,y}[ I(x+u,y+v) - I(x,y)]^{2}\]

  • テイラー展開を用いると:

    \[E(u,v) \approx \sum _{x,y}[ I(x,y) + u I_{x} + vI_{y} - I(x,y)]^{2}\]

  • 式を展開し、適切に打ち消すと:

    \[E(u,v) \approx \sum _{x,y} u^{2}I_{x}^{2} + 2uvI_{x}I_{y} + v^{2}I_{y}^{2}\]

  • これは行列形式で次のように表せる:

    \[E(u,v) \approx \begin{bmatrix} u & v \end{bmatrix} \left ( \displaystyle \sum_{x,y} w(x,y) \begin{bmatrix} I_x^{2} & I_{x}I_{y} \\ I_xI_{y} & I_{y}^{2} \end{bmatrix} \right ) \begin{bmatrix} u \\ v \end{bmatrix}\]

  • ここで次のように表す:

    \[M = \displaystyle \sum_{x,y} w(x,y) \begin{bmatrix} I_x^{2} & I_{x}I_{y} \\ I_xI_{y} & I_{y}^{2} \end{bmatrix}\]

  • したがって、今や式は次のようになる:

    \[E(u,v) \approx \begin{bmatrix} u & v \end{bmatrix} M \begin{bmatrix} u \\ v \end{bmatrix}\]

  • コーナーを含む可能性があるかどうかを判定するために、各ウィンドウについてスコアが計算される:

    \[R = det(M) - k(trace(M))^{2}\]

    ここで:

    • det(M) = \(\lambda_{1}\lambda_{2}\)
    • trace(M) = \(\lambda_{1}+\lambda_{2}\)

    スコア \(R\) がある値より大きいウィンドウは「コーナー」とみなされる

コード

解説

結果

元の画像:

検出されたコーナーは小さな黒い円で囲まれている