我使用了这个FLANN特征匹配。我还尝试了使用ORB和BRISK描述符。它显示了结果。现在,我如何计算匹配的特征数量?我试过print(len(matches),但它给了我1589。我不认为它是1589年的照片。
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img1 = cv.imread('trainImage1.png', 0)
img2 = cv.imread('trainImage2.png', 0)
brisk = cv.BRISK_create(60, 2, 2)
kp1, des1 = brisk.detectAndCompute(img1, None)
kp2, des2 = brisk.detectAndCompute(img2, None)
FLANN_INDEX_LSH = 6
index_params = dict(algorithm=FLANN_INDEX_LSH, table_number=6, key_size=12, multi_probe_level=1)
search_params = dict(checks=50)
flann = cv.FlannBasedMatcher(index_params, search_params)
matches = flann.knnMatch(des1, des2, k=2)
matchesMask = [[0, 0] for i in range(len(matches))]
for i, (m, n) in enumerate(matches):
if m.distance < 0.7*n.distance:
matchesMask[i] = [1, 0]
draw_params = dict(matchColor=(0, 255, 0), singlePointColor=(255, 0, 0), matchesMask=matchesMask, flags=cv.DrawMatchesFlags_DEFAULT)
img3 = cv.drawMatchesKnn(img1, kp1, img2, kp2, matches, None, **draw_params)
print(len(matches))
plt.imshow(img3,), plt.show()有谁能帮帮我吗?
发布于 2020-07-17 17:42:00
当你想绘制匹配点时,你需要给出空数组作为matchesMask。
draw_params = dict(matchColor=(0, 255, 0), singlePointColor=(255, 0, 0), matchesMask=[], flags=cv.DrawMatchesFlags_DEFAULT)发布于 2020-07-19 23:54:37
这些算法存在误差。这就是为什么你必须过滤结果的原因。一种通用的过滤器是大小过滤器。这意味着您将忽略小于或大于某个大小的匹配项。这些最大值和最小值取决于您的情况。匹配的大小、比例和位置是另一个过滤器。
发布于 2021-03-19 18:22:40
我认为匹配的数量是真正的1589个。结果在你的图片中,只画了几个匹配。
尝试将你的第一个训练图像与实际上彼此不相关的随机图像进行比较。如果数量减少,那么matches实际上显示了matches对象的数量。
https://stackoverflow.com/questions/62951152
复制相似问题