Skip navigation

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

Példa

Az alábbi program az input képen keres jellemzőpontokat a Shi-Tomasi sarokdetektorral. A képet a notebook-fá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 (blokkméret, apertúra mérete, a k paraméter).
  4. Elvégezzük a sarokpont detektálást a cornerHarris() függvénynel. Az eredményt a cornerness képben kapjuk, amely a sarkossági válaszfüggvény értékeit tartalmazza.
  5. Meghatározzuk a minimum és maximum értékeket.
  6. Meghatározunk egy küszöbértéket.
  7. Kirajzoljuk és kimentjük a küszöbölt sarkossági képet.

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


SOURCE_IMAGE='lisbon1.jpg'
OUTPUT_IMAGE='harris_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 Harris sarokdetektorral
##  - meg kell adnunk az alábbi paramétereket:
blockSize = 2    # az ablakméret a sajátérték és sajátvektor számításhoz
apertureSize = 3 # a Sobel operátor ablakmérete
k = 0.004        # a Harris sarokdetektor paramétere (lásd a képletet a leírásban)
gray_img = np.float32(gray_img)
cornerness = cv2.cornerHarris(gray_img, blockSize, apertureSize, k)
#cornerness = cv2.normalize(cornerness,None)
cv2.imwrite('cornerness.jpg', cornerness)


## a kapott kép még csak a sarkossági válaszfüggvényt tartalmazza
## ahhoz, hogy ténylegesen sarokpontokat kapjunk küszöbölnünk kell
## kiszámoljuk a minimális és maximális sarkosságot a képen és
## határozzuk meg a küszöböt (ez képenként változhat).
minval, maxval, _, _ = cv2.minMaxLoc(cornerness)
threshold = 0.06 * maxval
print("min:" + str(minval))
print("max:" + str(maxval))
ret, corner_img = cv2.threshold(cornerness, threshold, 255, cv2.THRESH_BINARY);
cv2.imwrite(OUTPUT_IMAGE, corner_img)

plt.imshow(corner_img);
plt.title(OUTPUT_IMAGE)
plt.show()