首页 > 解决方案 > 为什么 cv2.DescriptorMatcher 效果不佳?

问题描述

我想执行一些图像对齐。还有下一个功能 - 我有一些面部地标,并希望通过某些检测器与这些地标的距离来过滤由某些检测器建立的关键点。所以这里是主要代码

akaze = cv2.AKAZE_create(threshold = 0)
keypoints1, descriptors1 = akaze.detectAndCompute(initialFace_gray, mask=None)
keypoints2, descriptors2 = akaze.detectAndCompute(resultFace_gray, mask=None)

save_descriptors1 = descriptors1.copy()
eps = 10
def condition(point):
    for borderPoint in initialLandmarks:
        if np.linalg.norm(np.array(point.pt) - borderPoint) < eps:
            return True
    return False
keypoints_descriptors1 = list(filter(lambda x : condition(x[0]), zip(keypoints1, descriptors1)))
keypoints1, descriptors1 = [], []
for keypoint, descriptor in keypoints_descriptors1:
    keypoints1.append(keypoint)
    descriptors1.append(descriptor)
descriptors1 = np.array(descriptors1)

keypoints_descriptors2 = list(filter(lambda x : condition(x[0]), zip(keypoints2, descriptors2)))
keypoints2, descriptors2 = [], []
for keypoint, descriptor in keypoints_descriptors2:
    keypoints2.append(keypoint)
    descriptors2.append(descriptor)
descriptors2 = np.array(descriptors2)

它给了我接近给定地标的关键点。但是当我运行匹配器时:

matcher = cv2.DescriptorMatcher_create(cv2.DESCRIPTOR_MATCHER_BRUTEFORCE_SL2)
matches = matcher.match(descriptors1, descriptors2, None)

# Sort matches by score
matches.sort(key=lambda x: x.distance, reverse=False)

GOOD_MATCH_PERCENT = 1
# Remove not so good matches
numGoodMatches = int(len(matches) * GOOD_MATCH_PERCENT)

matches = matches[:numGoodMatches]

它给了我以下不良匹配 匹配不良

我尝试改变参数epsthresholdGOOD_MATCH_PERCENT,但结果仍然相同。即使保留了几个点,它们仍然很匹配(下巴到鼻子,鼻子到眉毛等)。

我该如何解决?过滤有问题吗?

标签: pythonopencvkeypoint

解决方案


推荐阅读