Skip navigation

Példa pontmegfeleltetésre FLANN-alapú párosítással

Példa

A feladat a következő:

  1. Nyissuk meg a két input képet!
  2. Konvertáljuk szürkeárnyalatossá őket!
  3. Detektáljunk rajtuk jellemzőpontokat és számoljuk ki a leírókat is!
  4. Hozzuk létre a párosítót és hajtsuk végre a párosítást!
  5. 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)