Skip navigation

Kulcspontok és leírók

Jellemzői

A sarokpontokhoz jól megfogalmazható geometriai jelentés társítható. Pontjellemzőket nem csak élek találkozásánál várhatunk, lehet például egy egyedi lokális képi környezettel rendelkező pont is. Általánosan kulcspontoknak nevezzük az automatikusan meghatározott pontokat.

A koordináta mellett a kulcspontok rendelkezhetnek további információval is, mint például a lokális képi környezetének orientációja és mérete. Az orientáció és méret alapján a képi információból egy rögzített méretű leírót (deszkriptort) számíthatunk, ami egységes módon írja le a képi tartalmat. Ez az információ jelentősen megkönnyíti a párosításukat. SIFTés SURF esetén ezek a leírók lebegőpontos számok, AKAZE és ORB esetén bináris minták. Ez a leírók összehasonlításánál játszik majd fontos szerepet.

Számos kulcspont detektor módszert találunk a szakirodalomban. Az OpenCV is megvalósít ezek közül jónéhányat.

A legnépszerűbbek a SIFT és a SURF módszerek, viszont ezek szabadalmi oltalom alatt állnak. Ez azt jelenti, hogy oktatási/kutatási munkákhoz szabadon felhasználhatók, de kereskedelmi szoftvertermék esetén jogdíjat kell fizetni a tulajdonosok felé. Az OpenCV a contrib csomagjának nonfree részében találjuk az implementációjukat. A hivatalos Python OpenCV csomag nem tartalmazza a nonfree részeket, ezért ezekkel itt nem foglalkozunk.

AKAZE kulcspontok detektálása

Példaként az AKAZE kulcspont detektor és leíró használatát nézzük át az ocv_detect_AKAZE.py példaprogramon keresztül.

Beolvasás és szürkeárnyalatos konverzió.

import cv2
import numpy as np

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

AKAZE kulcspont és leíró számító extractor objektum létrehozása. Kulcspont információt kinyerni egy képből a detect(), meglévő kulcspontokhoz leírót számítani az objektum compute() függvényével lehet. Mindkét lépést megvalósítja a detectAndCompute() függvény, amit a példában használunk. Ez egy kulcspont listát, és a hozzá tartozó leíró listát ad vissza.

extractor = cv2.AKAZE_create()
kp, des = extractor.detectAndCompute(img, None)

A kinyert kulcspontok adataihoz (koordináta, orientáció, méret, erősség) az alábbi módon férhetünk hozzá.

print('Number of keypoints:', len(kp))
print('Keypoint analysis: (coord_x, coord_y), angle size response')
for k in kp:
    print(k.pt, k.angle, k.size, k.response)

Az első kulcsponthoz tartozó leíró adatainak kiírása a konzolra.

print('Descriptor analysis for the first keypoint')
print('Descriptor vector size:', len(des[0]))
print('Descriptor vector values', des[0])

Az OpenCV a cv2.drawKeypoints() függvénnyel lehetővé teszi a kulcspontok egyszerű vizualizációját. Át kell adnunk a képet, amire a kulcspontokat rajzolni szeretnénk (img), a rajzolandó kulcspont listát (kp), az eredményképet (nem kötelező, ez lesz a függvény visszaadott értéke), a kulcspontok színét tuple objektumként, valamint a rajzolás módját. Ez lehet cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS (csak koordináták rajzolása), vagy cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS (orientáció és méret is megjelenik).

img = cv2.drawKeypoints(img, kp, None, (255, 0, 0), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imshow('AKAZE', img)

cv2.waitKey(0)
cv2.destroyAllWindows()

AKAZE eredmény

A kulcspontok vizualizációja:

Az első kulcsponthoz tartozó leíró:

Descriptor vector size: 61
Descriptor vector values [101 24 124 60 136 17 120 59 224 207 240 13 135 97 238 191 249 97
126 200 15 8 224 135 31 50 0 24 134 0 126 255 95 3 248 255
4 176 255 0 0 252 255 1 102 135 31 252 135 247 192 15 110 128
1 2 0 228 121 255 63]

Mérete 61 bájt. A leírót bitenként kell értelmezni, nem egész számként!

ORB detektor és leíró

Nagyon hasonló módon használhatjuk az ORB módszert (ocv_detect_ORB.py). Az extractor létrehozásakor át kell adni a kért kulcspontok számát.

MAX_FEATURES = 50

extractor = cv2.ORB_create(MAX_FEATURES)
kp, des = extractor.detectAndCompute(img, None)

ORB eredmény

Kulcspontok:

Leíró információ:

Descriptor analysis for the first keypoint
Descriptor vector size: 32
Descriptor vector values [ 19 33 71 135 146 27 45 21 45 225 27 198 109 6 154 164 54 163
30 173 197 144 37 204 164 76 190 128 47 222 129 125]

32 bájtos, bináris leíró vektor.

Kulcspontdetekció videó képkockákon

A különféle kulcspontdetektorok működése jobban megfigyelhető egy videó képkockáin végrehajtva. Az ocv_detect_keypoint_video.py példaprogram megnyitja a videófolyamot, és minden képkockán végrehajtja és megjeleníti a kulcspont információkat. A forráskódban választhatjuk ki az AKAZE, ORB és GFTT módszereket.

Bemeneti videó adat:

  • cv_book_scene.mp4 (A példatárban megtalálható.)

Elmentett eredményeket érhetünk el az alábbi linkeken: