Skip navigation

Példaprogram a Shi-Tomasi sarokdetektor használatára OpenCV-ben

A Shi-Tomasi sarokdetektor használata

A Shi-Tomasi sarokdetektorhoz a goodFeaturesToTrack() függvényt használjuk.
A függvényben meg kell adni

  • a szürkeárnyalatos képet, amelyen a sarokpontokat szeretnénk meghatározni,
  • a detektálandó sarokpontok maximális számát,
  • a sarkosság minőségi küszöbét (0-1 közötti érték)
  • a detektált pontok közötti minimális euklideszi távolságot (hogy ugynazon pontot ne detektáljuk kétszer)
  • a maszkot (ha van)
  • a kereső ablak blokkméretét
  • használjon-e a függvény Harris detektort
  • a k paramétert, amennyiben a Harris detektort használjuk

Példaprogram

Az alábbi program az input képen keres jellemzőpontokat a Shi-Tomasi sarokdetektorral. A képet a notebook-fájl vagy a forrásfájl mellé érdemes elhelyezni, vagy át kell írni az elérési útvonalat.

A lépések a következők:

  1. Megnyitjuk a képet.
  2. Az RGB színes képet szürkeárnyalatosság konvertáljuk és a továbbiakban ezzel a változattal dolgozunk.
  3. Beállítjuk a detektor paramétereit (maximális sarokpontok száma, sarokpontok minősége, blokkméret, minimális távolság)
  4. Elvégezzük a sarokpont detektálást a goodFeaturesToTrack() függvénynel. Az eredményt a corners változóban kapjuk, amely a sarokpontkoordináták listáját tartalmazza.
  5. A sarokpontokat egyenként kirajzoljuk.

import cv2
import numpy as np
from matplotlib import pyplot as plt


SOURCE_IMAGE='lisbon1.jpg'
OUTPUT_IMAGE='shiTomasi_lisbon1.jpg'

## kép beolvasása
img = cv2.imread(SOURCE_IMAGE);

## a képet szürkeárnyalatossá konvertáljuk
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

## sarokpontok keresése Shi-Tomasi sarokdetektorral
## a detektor a sarokpontok koordinátáit adja meg
##  - meg kell adnunk az alábbi paramétereket:
maxCorners = 0     # ha nulla számot adunk meg, akkor nincs korlátozás a pontok számát illetően
qualityLevel = 0.5 # hány százalékát tartsa meg a pontoknak (a legerősebbek maradnak meg)
blockSize = 3      # az ablakméret a sajátérték és sajátvektor számításhoz
minDistance = 10   # legalább ennyi legyen a detektált pontok Euklideszi távolsága
k = 0.004          # a Harris sarokdetektor paramétere (lásd a képletet a leírásban, ez most nem szükséges)
#gray_img = np.float32(gray_img)
corners = cv2.goodFeaturesToTrack(gray_img, maxCorners, qualityLevel, minDistance) # az utolsó néhány paraméter alapértelmezett
corners = np.int0(corners);

out_img = img
for i in corners:
    x,y = i.ravel() # numpy függvény
    cv2.circle(out_img, (x,y), 10, 255, 3)

cv2.imwrite(OUTPUT_IMAGE, out_img)
plt.imshow(out_img);
plt.title(OUTPUT_IMAGE)
plt.show()