二进制掩码之间的关键点检测和匹配

Keypoints detection and matching between binary masks

我正在尝试使用 opencv (tutorial) 在如下所示的图像之间匹配关键点。 问题是我不确定我是否需要调整一些参数或者我完全使用了错误的方法。只取 map.png 的右侧也无济于事。 这是我的代码和结果。

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

img1 = cv2.imread('../map.png',0)
img2 = cv2.imread('../mask.png',0)

orb = cv2.ORB_create()

kp1, des1 = orb.detectAndCompute(img1,None)
kp2, des2 = orb.detectAndCompute(img2,None)

bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)

matches = bf.match(des1,des2)

matches = sorted(matches, key = lambda x:x.distance)

img3 = cv2.drawMatches(img1,kp1,img2,kp2,matches[:20], None, flags=2)
cv2.imwrite('test.png', img3)

您使用的 ORB 等特征检测器旨在匹配平移、旋转和比例不同的图像之间的特征点。当图像在视角上存在显着差异(这是您的情况)时,不打算使用它们,因此您的方法不起作用。此外,此类算法专为纹理丰富的图像(例如照片)而设计。在您的情况下,特征是重复的(从第一张图像中提取的多个特征点,例如行尾,可以与另一张图像中的单个点匹配)。 在您的情况下,您应该考虑其他功能,例如基于线交叉的功能,请参阅 tutorial 了解更多信息。这只是一个提示,不是您问题的解决方案,因为它确实具有挑战性。