python - 为什么 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]
我尝试改变参数eps
、threshold
和GOOD_MATCH_PERCENT
,但结果仍然相同。即使保留了几个点,它们仍然很匹配(下巴到鼻子,鼻子到眉毛等)。
我该如何解决?过滤有问题吗?
解决方案
推荐阅读
- javascript - 无法访问 SharePoint CAML 查询的多维数组元素
- flutter - 为什么当我在颤振应用程序中使用键盘时这会显示给我
- javascript - 尝试从表中动态读取时出现 SQL 错误
- python - 分页链接在我的 BeautfiulSoup Python 代码中重复
- javascript - 如何获取登录ID
- python - 如何从 Paginator 的页面返回 JsonResponse?Page 类型的对象不是 JSON 可序列化的
- email-attachments - 如何使用 mailgun 发送带附件的电子邮件
- javascript - 使用 JavaScript 将 CSV 转换为 JSON
- python - 从其他 dask 延迟函数中调用 dask 延迟函数
- android - Android蓝牙微微网:为什么第7个从机没有连接?