コーナー検出は、画像内の物体の形状やエッジの特徴を捉えるのに役立ちます。今回は、代表的なコーナー検出アルゴリズムであるHarrisコーナー検出とShi-Tomasiコーナー検出を使用します。
必要なライブラリのインポート
OpenCVとNumPyをインポートします。OpenCVは画像処理のため、NumPyは配列操作に使用します。
import cv2
import numpy as np
1. 画像の読み込みとグレースケール変換
まず、解析対象の画像を読み込み、コーナー検出を行いやすくするためにグレースケールに変換します。
# 入力画像の読み込み
image = cv2.imread("input.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
ここでinput.jpgは解析対象の画像ファイルです。
2. Harrisコーナー検出
Harrisコーナー検出は、エッジや角のような急激な変化のある領域を検出するアルゴリズムです。次のコードで、OpenCVのcv2.cornerHarris関数を使用してHarrisコーナーを検出します。
# Harrisコーナー検出
dst = cv2.cornerHarris(gray, 2, 3, 0.04)
# 結果を目に見える形にするため、コーナーの強度が閾値を超えた部分を強調
image[dst > 0.01 * dst.max()] = [0, 0, 255]
・2 はブロックサイズで、コーナー検出のウィンドウサイズを指定します。
・3 はSobel微分のカーネルサイズです。
・0.04 はHarris検出器のパラメータで、コーナーの敏感度を調整します。
dst > 0.01 * dst.max()という条件を用いることで、コーナーと判断されたピクセルを赤色([0, 0, 255])で強調表示しています。
3. Shi-Tomasiコーナー検出
Shi-Tomasiコーナー検出は、Harrisコーナー検出の改良版で、より正確な角点を検出できます。cv2.goodFeaturesToTrack関数を使って、指定した数の最も強いコーナーを取得します。
# Shi-Tomasiコーナー検出
corners = cv2.goodFeaturesToTrack(gray, maxCorners=100, qualityLevel=0.01, minDistance=10)
corners = np.int0(corners)
# コーナーを描画
for corner in corners:
x, y = corner.ravel()
cv2.circle(image, (x, y), 3, (0, 255, 0), -1)
・maxCorners=100は、検出するコーナーの最大数を指定しています。
・qualityLevel=0.01は、最小限のコーナー品質を指定します。値が小さいほど多くのコーナーが検出されます。
・minDistance=10は、検出されるコーナー間の最小距離を指定します。
検出された各コーナーの座標を取得し、緑色の小さな円(半径3)を描画します。
4. 結果の表示
処理結果をウィンドウに表示し、コーナー検出の結果を確認します。
# 結果を表示
cv2.imshow("Corners", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imshowで結果画像を表示し、cv2.waitKey(0)でキーが押されるまでウィンドウを開いたままにします。最後にcv2.destroyAllWindows()ですべてのウィンドウを閉じます。