A fundamentális mátrix meghatározása
A következő kódrészletben megnézzük hogyan tudjuk meghatározni a fundamentális mátrixot. A fundamentális mátrix ugyanarról a látványról készült két kép között teremt kapcsolatot. Ehhez meg kell határozni az azonos pontokat a két képen, legalább 7-et vagy 8-at (a 7 és 8 pontos algoritmus miatt, de minél többet határozunk meg, annál jobb eredményt kapunk).
Az OpenCV-ben a fundamentális mátrixot a findFundamentalMat() függvénnyel kapjuk meg.
A feladatban az alábbi képeket használjuk:
import cv2
import numpy as np
SOURCE_IMAGE1='../tea05.jpg'
SOURCE_IMAGE2='../tea08.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)
## 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 kNN-alapú,
## minden pontnak két lehetséges párja lehet
# csak a jó párosításokat tároljuk el, amelyek átmentek a Lowe-teszten
good = []
for m,n in matches:
if m.distance < 0.7*n.distance:
good.append(m)
points1 = []
points2 = []
for m in good:
points1.append(keypoints1[m.queryIdx].pt)
points2.append(keypoints2[m.trainIdx].pt)
points1, points2 = np.float32((points1, points2))
draw_params = dict(matchColor = (0,255,0),
singlePointColor = (255,0,0),
# matchesMask = matchesMask,
flags = 0)
matching_img = cv2.drawMatchesKnn(img1,keypoints1,img2,keypoints2,matches[:300],None)
cv2.imwrite("matching_image.png", matching_img)
## A fundamentális mátrix meghatározása
F, F_mask = cv2.findFundamentalMat(points1, points2, cv2.FM_8POINT)
print("A fundamentális mátrix:")
print(F)