【OpenCV】goodFeaturesToTrack関数によるコーナー検出

【OpenCV】goodFeaturesToTrack関数によるコーナー検出 プログラミング

OpenCVと言えば、やはり顔認識のイメージです。
しかし、OpenCVには便利な機能が用意されています。

今回は、特徴検出の一つであるコーナー検出を解説していきます。

本記事の内容

  • コーナー検出とは?
  • OpenCVによるコーナー検出
  • goodFeaturesToTrack関数によるコーナー検出

それでは、上記に沿って解説していきます。

コーナー検出とは?

コーナー検出は、確実と言える特徴点を抽出し画像の中身を推測することです。
主に、以下で利用されています。

  • 動き検出
  • 画像マッチング
  • 画像追跡
  • イメージモザイキング
  • パノラマ画像生成
  • 3Dモデリング
  • 物体認識

コーナーと言うからには、「角」だと思いますよね。
でも、これが「角」の意味だけではありません。

コーナーとは、2つのエッジの交点と定義されています。
エッジに関しては、次の記事が参考になります。

簡単に言うと、エッジは境界線です。
その境界線と境界線が交わる点が、コーナーということになります。

そのため、角以外にもコーナーにはなりえます。
と言っても、角の検出が多いようですけどね。

そして、このコーナー検出には複数の方法が存在しています。
とりあえず、有名どころを3つ挙げておきます。

  • Harrisコーナー検出
  • Shi-Tomasiのコーナー検出
  • FASTコーナー検出

以上より、コーナー検出についてはイメージできるようにはなったはずです。
では、OpenCV上ではこのコーナー検出をどのように扱っているのでしょうか?

そのことについて、関数やクラスをメインにして確認していきます。

OpenCVによるコーナー検出

OpenCVによるコーナー検出は、上記で挙げた方法に対応するモノが提供されています。

コーナー検出方法関数・クラス
Harrisコーナー検出cornerHarris()
Shi-Tomasiのコーナー検出goodFeaturesToTrack()
FASTコーナー検出FastFeatureDetector

Harrisコーナー検出とShi-Tomasiのコーナー検出は、関数が用意されています。
FASTコーナー検出に関しては、専用のクラスが用意されているということです。

そして、今回はgoodFeaturesToTrack()を使ってコーナー検出を試してみましょう。

goodFeaturesToTrack関数によるコーナー検出

前提として、OpenCVが利用できるようにしておいてください。
OpenCVのインストールに関しては、次の記事で解説しています。

あとは、コーナー検出の結果を表示するためにNumpyを利用しています。
そのため、Numpyもインストールしておいてください。

準備が整ったら、まずは画像を用意しましょう。
なるべくコーナーがはっきりとわかる画像がいいですね。

これだけ角が明確なら、サンプル画像としては問題ないでしょう。
では、この画像input.jpgとします。

このinput.jpgのコーナー検出を行いましょう。
ただ、goodFeaturesToTrack関数でコーナー検出をしただけなら、何がなんだかわからないでしょう。

コーナー検出で抽出できた特徴点をオリジナル画像に反映させます。
上記の処理を行っているのが、以下のコードです。

import numpy as np
import cv2

# 画像読み込み
img = cv2.imread('input.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)

# 特徴点を元画像に反映させた画像を作成
cv2.imwrite("output.png", img)

上記コードを実行した結果で作成された画像は以下。

見事にコーナー(角)を抽出でてきていますね。

プログラムはコメントを見ればわかると思います。
ただ、以下の関数部分だけ説明しておきます。

corners = cv2.goodFeaturesToTrack(gray, 25, 0.01, 10)

関数定義は、以下。

cv2.goodFeaturesToTrack(image, maxCorners, qualityLevel, minDistance[, corners[, mask[, blockSize[, useHarrisDetector[, k]]]]]) → corners

maxCornersは、抽出するコーナー数の最大値です。
今回は、25を設定しています。
そのため、最大で25個までは抽出可能ということですね。

qualityLevelは、抽出するコーナーの最低品質レベルのことです。
0.0~1.0の範囲で指定できます。
つまり、ここの値は低い方がコーナーを抽出しやすいと言えます。

minDistanceは、コーナー間の間隔(ユークリッド距離)の指定です。
0に近いほど、密接を許すということになります。

以上、goodFeaturesToTrack関数によるコーナー検出の説明でした。

タイトルとURLをコピーしました