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関数によるコーナー検出の説明でした。