我有一张全景图像,以及在该全景图像中看到的较小的建筑物图像。我想要做的是识别该较小图像中的建筑物是否在该全景图像中,以及这两个图像如何排列。
对于第一个示例,我使用的是全景图像的裁剪版本,因此像素是相同的。
import cv2
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
import math
# Load images
cwImage = cv2.imread('cw1.jpg',0)
panImage = cv2.imread('pan1.jpg',0)
# Prepare for SURF image analysis
surf = cv2.xfeatures2d.SURF_create(4000)
# Find keypoints and point descriptors for both images
cwKeypoints, cwDescriptors = surf.detectAndCompute(cwImage, None)
panKeypoints, panDescriptors = surf.detectAndCompute(panImage, None)
然后我使用 OpenCV 的 FlannBasedMatcher 来找到两个图像之间的良好匹配:
FLANN_INDEX_KDTREE = 0
index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
search_params = dict(checks=50)
flann = cv2.FlannBasedMatcher(index_params, search_params)
# Find matches between the descriptors
matches = flann.knnMatch(cwDescriptors, panDescriptors, k=2)
good = []
for m, n in matches:
if m.distance < 0.7 * n.distance:
good.append(m)
所以你可以看到,在这个例子中,它完美地匹配了图像之间的点。然后我找到了单应性,并应用了透视扭曲:
cwPoints = np.float32([cwKeypoints[m.queryIdx].pt for m in good
]).reshape(-1, 1, 2)
panPoints = np.float32([panKeypoints[m.trainIdx].pt for m in good
]).reshape(-1, 1, 2)
h, status = cv2.findHomography(cwPoints, panPoints)
warpImage = cv2.warpPerspective(cwImage, h, (panImage.shape[1], panImage.shape[0]))
结果是它完美地将较小的图像放置在较大的图像中。
现在,我想在较小的图像不是较大图像的像素完美版本的情况下执行此操作。
对于新的较小图像,关键点如下所示:
您可以看到,在某些情况下,它匹配正确,而在某些情况下却没有。
如果我调用findHomography
这些匹配,它将考虑所有这些数据点并提出一个无意义的扭曲视角,因为它基于正确的匹配和不正确的匹配。
我正在寻找的是检测良好匹配和调用之间缺少的步骤,findHomography
我可以在其中查看匹配之间的关系,并确定哪些匹配是正确的。
我想知道 OpenCV 中是否有我应该在这一步中查看的功能,或者这是否是我需要自己解决的问题,如果是,我应该如何去做?