Skip navigation

Sarokpont detektorok

Jellemzői

A Harris-Stephens sarokpont detektor az egyik legnépszerűbb alkalmazott módszer. A bemeneti szürkeárnyalatos kép minden képpontjához egy saroksági értéket rendel. Ebből választhatjuk ki a számunkra szükséges sarokpontokat, többféle stratégia szerint.

  • Választhatjuk az N darab legmagasabb értékűt.
  • Választhatjuk az adott saroksági küszöb feletti értékűeket.
  • Egymás közelében előforduló detekciókból megtarthatjuk a legerősebbet.

Hasonló elvre épül az úgynevezett GFTT (Good Features to Track) detektor, amelyet sikeresen használnak videóképeken jellemzők követésére.

Harris-Stephens detektor használata

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)

Harris eredmények

Bementi kép és saroksági mátrixa:

 

Küszöbölve a maximális érték 70%-ánál:

Animáció a különböző küszöbértékekre:

GFTT detektor

Elvi háttere szempontjából nagyon hasonló a Harris-hez, de felhasználási módja szerint OpenCV-ben eltérő a GFTT detektor. Az ocv_detect_GFTT.py példaprogamot követjük végig.

Kép beolvasása és szürkeárnyalatosra alakítása.

import numpy as np
import cv2

filename = 'Sudoku_rs.jpg'
img = cv2.imread(filename)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

A cv2.goodFeaturesToTrack() függvény egy sarokpont listát ad vissza, amely a pontok koordinátáit tartalmazza. Paraméterként a bemeneti képet, a kért sarokpontok számát (N), a detekció minőségét szabályozó értéket (qualityLevel), és a sarokpontok közötti minimális távolságot (minDist) várja. A programunk 5 darabtól 50 darabig, 5-ös léptékkel mutatja meg az eredményt.

for N in np.arange(5, 50, 5):
    # Finds N strongest corner points and return them as list
    # image, N, qualityLevel, minDist
    corners = cv2.goodFeaturesToTrack(gray, N, 0.01, 10)

    for i in corners:
        x, y = i.ravel()
        cv2.circle(img, (x, y), 3, (0, 0, 255), -1)

    cv2.imshow('Result', img)
    cv2.waitKey(0)

cv2.destroyAllWindows()

GFTT eredmény