Я рассчитываю процентное совпадение между двумя изображениями, используя surf и knn-matcher.моя функция дает различное процентное соответствие, когда я передаю два изображения в обычном порядке (image1, image2) и в обратном порядке (image2, image1) в качестве аргумента.
В настоящее время я изменил свой код, чтобы сравнить два изображения в оригинальном, а также в обратном порядке и взять среднее значение.Есть ли лучший способ найти точный процент соответствия.Любые другие предложения для библиотек, кроме SURF или любого другого метода, также будут полезны
def SURF_match(img1, img2, hessianThreshold: int = 400, ratio_thresh: float = 0.7):
"""Give fraction match between 2 images using SURF and FLANN
Parameters
----------
img1 : Open CV image format,
img2 : Open CV image format,
Returns
-------
float,
returns a number from 0 to 1 depending on percentage match
"""
detector = cv2.xfeatures2d_SURF.create(hessianThreshold)
keypoints1, descriptors1 = detector.detectAndCompute(img1, None)
keypoints2, descriptors2 = detector.detectAndCompute(img2, None)
a1 = len(keypoints1)
b1 = len(keypoints2)
if a1 < 2 or b1 < 2:
return 0
matcher = cv2.DescriptorMatcher_create(cv2.DescriptorMatcher_FLANNBASED)
knn_matches = matcher.knnMatch(descriptors1, descriptors2, 2)
good_matches = []
for m, n in knn_matches:
if m.distance < ratio_thresh * n.distance:
good_matches.append(m)
c1 = len(good_matches)
fraction = (2.0 * c1) / (a1 + b1)
if(fraction > 1): fraction = 1
# fraction can be greater than one in blur images because we are multiplying fraction with 2
return fraction