knn matcher в прибое дает различное процентное совпадение, когда изображения передаются в обратном порядке - PullRequest
0 голосов
/ 23 мая 2019

Я рассчитываю процентное совпадение между двумя изображениями, используя 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
...