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 で出てきた結果をゴニョゴニョ(適切な閾値処理)した結果を、コーナーとみなすらしい。

元画像 f:id:pongsuke:20170524131853j:plain

cv2.cornerHarris の結果 f:id:pongsuke:20170524133030p:plain

cv2.cornerHarris の閾値処理後 f:id:pongsuke:20170524133041p:plain

適用結果 f:id:pongsuke:20170524133048p:plain