A detektor használatát az ocv_Harris_detect.py példaprogramon keresztül mutatjuk be. Lényege, hogy az eredeti képpel megegyező méretű saroksági mátrixot ad vissza.
Beillesztjük a szükséges import fájlokat.
import cv2
import numpy as np
Betöltjük a képet, szürkeárnyalatossá, majd float32 típusúvá alakítjuk.
filename = 'Sudoku_rs.jpg'
img = cv2.imread(filename)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = np.float32(gray)
A saroksági értékeket a cv2.cornerHarris() függvény készíti el. A függvény a sarokdetektálás környezet méretét, a Sobel gradiens operátor méretét, valamint a k paraméter értékét várja. A képként való megjelenítéshez és fájlba mentéshez bájtos reprezentációra kell alakítanunk az eredményt.
# blockSize - It is the size of neighbourhood considered for corner detection
# ksize - Aperture parameter of Sobel derivative used.
# k - Harris detector free parameter in the equation.
dst = cv2.cornerHarris(gray, 5, 3, 0.04)
dst_8u = cv2.normalize(dst, None, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8UC1)
cv2.imshow('8u', dst_8u)
A jobb láthatóság kedvéért szürkeárnyalatos dilatációt hajtunk végre az eredményen. Ez nagyobb méretben mutatja majd az eredmény sarokpontokat.
# Result is dilated for marking the corners
dst = cv2.dilate(dst, None)
A saroksági értékek mátrixát többféle értékkel küszöböljük és jelenítjük meg az eredeti szürke képre vörös színnel rávetítve. A ciklus a legnagyobb saroksági értéktől indul, és 5%-os csökkenéssel lépked. Így egyre több pont fogja a kritériumot teljesíteni. Billentyűlenyomással léphetünk a következő eredményre.
# Threshold for an optimal value, it may vary depending on the image.
counter = 0
for th in np.arange(1.0, 0.1, -0.05):
counter = counter + 1
img[dst >= th * dst.max()] = [0, 0, 255]
# Normalize the map image for display
cv2.normalize(dst, dst, 0, 1, cv2.NORM_MINMAX, cv2.CV_32F)
# Display and wait for exit
cv2.imshow('Harris map', dst)
cv2.imshow('Harris corner points', img)
cv2.waitKey(0)