opencv チュートリアルチャンレンジ 42 Harrisコーナー検出
Harrisコーナー検出 — OpenCV-Python Tutorials 1 documentation
#!/usr/bin/env python # -*- coding: utf-8 -* import sys import cv2 import numpy as np img = cv2.imread('170523-170301.jpg') #img = cv2.imread('170519-174830.jpg') #img = cv2.imread('170519-144402.jpg') #img = cv2.imread('chessboard.jpg') gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) gray = np.float32(gray) #dst = cv2.cornerHarris(gray, 2, 3, 0.04) dst = cv2.cornerHarris(gray, 4, 5, 0.04) #result is dilated for marking the corners, not important dst = cv2.dilate(dst, None) tmp = np.zeros(dst.shape[:2], np.uint8) tmp[ dst > 0.01*dst.max() ] = [255] tmp[ dst <= 0.01*dst.max() ] = [0] cv2.imshow('cornerHarrisMask',tmp) cv2.imwrite('cornerHarrisMask.png',tmp) # Threshold for an optimal value, it may vary depending on the image. img[ dst > 0.01*dst.max() ] = [0,0,255] cv2.imshow('cornerHarris',img) cv2.imshow('cornerHarris.png',img) cv2.waitKey(0) cv2.destroyAllWindows()
Harrisのコーナー検出を適用した結果は各画素が上記のスコア( R )を表すグレースケール画像になります.適切な閾値処理を施すと,画像中のコーナーを検出できます.
やってみる
cv2.cornerHarris で出てきた結果をゴニョゴニョ(適切な閾値処理)した結果を、コーナーとみなすらしい。
元画像
cv2.cornerHarris の結果
cv2.cornerHarris の閾値処理後
適用結果