2016-01-26 93 views
2

我正在嘗試實現一個程序,該程序將輸入兩個立體圖像並找出具有功能匹配的關鍵點之間的距離。有什麼辦法可以做到嗎?我與SIFT/BFMatcher工作,我的代碼如下:Python - 功能匹配關鍵點與OpenCV之間的距離

import numpy as np 
import cv2 
from matplotlib import pyplot as plt 

img1 = dst1 
img2 = dst2 

# Initiate SIFT detector 
sift = cv2.SIFT() 

# find the keypoints and descriptors with SIFT 
kp1, des1 = sift.detectAndCompute(img1, None) 
kp2, des2 = sift.detectAndCompute(img2, None) 

# BFMatcher with default params 
bf = cv2.BFMatcher() 
matches = bf.knnMatch(des1, des2, k=2) 

# Apply ratio test 
good = [] 
for m, n in matches: 
    if m.distance < 0.3 * n.distance: 
     good.append([m]) 

# cv2.drawMatchesKnn expects list of lists as matches. 
img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, good, flags=2, outImg=img2) 

plt.imshow(img3), plt.show() 

回答

3

以下算法img2發現的img1其功能相匹配的關鍵點的關鍵點之間的距離(ommiting第一行):

# Apply ratio test 
good = [] 
for m,n in matches: 
    if m.distance < 0.3 * n.distance: 
     good.append(m) 

# Featured matched keypoints from images 1 and 2 
pts1 = np.float32([kp1[m.queryIdx].pt for m in good]) 
pts2 = np.float32([kp2[m.trainIdx].pt for m in good]) 

# Convert x, y coordinates into complex numbers 
# so that the distances are much easier to compute 
z1 = np.array([[complex(c[0],c[1]) for c in pts1]]) 
z2 = np.array([[complex(c[0],c[1]) for c in pts2]]) 

# Computes the intradistances between keypoints for each image 
KP_dist1 = abs(z1.T - z1) 
KP_dist2 = abs(z2.T - z2) 

# Distance between featured matched keypoints 
FM_dist = abs(z2 - z1) 

因此,KP_dist1是與關鍵點img1之間的距離對稱矩陣,KP_dist2img2FM_dist相同與來自與012這兩個圖像的特徵匹配的關鍵點之間的距離的列表。

希望這有助於!