Példa
A feladat a következő:
- Nyissuk meg a két input képet!
- Konvertáljuk szürkeárnyalatossá őket!
- Detektáljunk rajtuk jellemzőpontokat és számoljuk ki a leírókat is!
- Hozzuk létre a párosítót és hajtsuk végre a párosítást!
- Rajzoljuk ki a párosított pontokat!
import cv2
import numpy as np
SOURCE_IMAGE1='../lisbon1.jpg'
SOURCE_IMAGE2='../lisbon2.jpg'
OUTPUT_IMAGE1='../keypoints_lisbon1.jpg'
OUTPUT_IMAGE2='../keypoints_lisbon2.jpg'
MATCHING_IMAGE='flann_matching_lisbon1_lisbon2.jpg'
## képek beolvasása
img1 = cv2.imread(SOURCE_IMAGE1);
img2 = cv2.imread(SOURCE_IMAGE2);
## a képet szürkeárnyalatossá konvertáljuk
gray_img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
gray_img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
## jellemzőpontok detektálása
surf = cv2.xfeatures2d.SURF_create()
keypoints1 = surf.detect(gray_img1, None)
keypoints2 = surf.detect(gray_img2, None)
## kulcspont leírók számítása
keypoints1, descriptors1 = surf.compute(gray_img1, keypoints1)
keypoints2, descriptors2 = surf.compute(gray_img2, keypoints2)
## kulcspontok kirajzolása
out_img1 = cv2.drawKeypoints(gray_img1, keypoints1, descriptors1, color=(255, 0, 255), flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
out_img2 = cv2.drawKeypoints(gray_img2, keypoints2, descriptors2, color=(255, 0, 255), flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imwrite(OUTPUT_IMAGE1, out_img1)
cv2.imwrite(OUTPUT_IMAGE2, out_img2)
## pontpárok keresése
## FLANN parameterek
FLANN_INDEX_KDTREE = 0
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
search_params = dict(checks=50) # or pass empty dictionary
flann = cv2.FlannBasedMatcher(index_params,search_params)
matches = flann.knnMatch(descriptors1,descriptors2,k=2) ## ez most kNN-alapú,
## minden pontnak két lehetséges párja lehet
# Csak a jó párosítások érdekelnek bennünket, így azokat maszkoljuk
matchesMask = [[0,0] for i in range(len(matches))]
# Lowe-féle arányteszt
for i,(m,n) in enumerate(matches):
if m.distance < 0.7*n.distance:
matchesMask[i]=[1,0]
draw_params = dict(matchColor = (0,255,0),
singlePointColor = (255,0,0),
matchesMask = matchesMask,
flags = 0)
img3 = cv2.drawMatchesKnn(img1,keypoints1,img2,keypoints2,matches,None,**draw_params)
cv2.imwrite(MATCHING_IMAGE, img3)