我有一个普通的ORB应用程序。由于无法找出单应性的准确性,因此我试图找出我的比赛的准确性,这是正确的方法吗?在我的代码中,除去异常值后的匹配显然在raw_matches中。我想要在执行比率测试后获得良好的匹配并找到它们的准确性。
码:
detector = cv2.ORB_create(FEATURESCOUNT)
kp1, desc1 = detector.detectAndCompute(img1, None)
kp2, desc2 = detector.detectAndCompute(img2, None)
flann_params= dict(algorithm = FLANN_INDEX_LSH, table_number = 6, key_size = 12, bmulti_probe_level = 1)
matcher = cv2.FlannBasedMatcher(flann_params, {})
raw_matches = matcher.knnMatch(desc1, trainDescriptors = desc2, k = 2)
ratio = 0.9
mkp1, mkp2 = [], []
for m in raw_matches:
if len(m) == 2 and m[0].distance < m[1].distance * ratio:
m = m[0]
mkp1.append( kp1[m.queryIdx] )
mkp2.append( kp2[m.trainIdx] )
print max(distmax)
distall = sum(i for i in distmax)
print distall/len(distmax)
p1 = np.float32([kp.pt for kp in mkp1])
p2 = np.float32([kp.pt for kp in mkp2])
comps =[]
res = []
kp_pairs = zip(mkp1, mkp2)
if len(p1) >= 4:
H, status = cv2.findHomography(p1, p2, cv2.RANSAC, 5.0)
comps = getComponents(H)
print (comps)
print('%d / %d inliers/matched' % (np.sum(status), len(status)))
else:
H, status = None, None
print('%d matches found, not enough for homography estimation' % len(p1))
最佳答案
单应性质量的一种常见度量(在两个图像中都存在错误的假设下)是重投影错误。当每个点对应的误差是高斯时,则最小重投影误差等于最大似然估计。它被计算为follows,其中(x_i,x_i')是对应关系,H是单应性,d是图像中的几何距离,这意味着在不均匀的图像点上。
findHomography在内部已经在尝试优化重投影错误。如果找不到单应性(基于传递的最大重投影错误),则该函数应返回None。
如果结果是完全错误的,我将把ORB更改为AKAZE特征,并减少RANSAC方案中的分类器的最大重投影误差。
如果单应性是一个很好的粗略估计,应该进一步优化,则可以使用单应性,通过用单应性映射每个点,在所有兴趣点上找到更多匹配项,并在本地邻居中找到最近的兴趣点。之后,您可以再次计算findHomography。