编程语言
首页 > 编程语言> > Python-使用OpenCV进行功能匹配的关键点之间的距离

Python-使用OpenCV进行功能匹配的关键点之间的距离

作者:互联网

我正在尝试实现一个程序,该程序将输入两个立体图像并查找具有功能匹配的关键点之间的距离.有什么办法吗?我正在使用SIFT / BFMatcher,我的代码如下:

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()

解决方法:

以下算法查找img1的关键点与其在img2中具有匹配特征的关键点之间的距离(省略第一行):

# 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_dist2对于img2相同,而FM_dist是一个列表,其中两个图像的特征匹配关键点之间的距离为len(FM_dist)== len(good).

希望这对您有所帮助!

标签:stereo-3d,opencv,python,pattern-matching
来源: https://codeday.me/bug/20191027/1944355.html