Skip navigation

Példa pontmegfeleltetésre brute-force párosítóval

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='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
bfMatcher = cv2.BFMatcher(cv2.NORM_L2, crossCheck=True)      ## brute-force párosító
                                                             ## bináris leírókhoz, mint az ORB,
                                                             ## a Hamming-távolságot javasolt használni
matches = bfMatcher.match(descriptors1, descriptors2);

img3 = cv2.drawMatches(        img1,keypoints1,       img2,keypoints2,      matches[:50], None, flags=2)
cv2.imwrite(MATCHING_IMAGE, img3)