SIFT альтернативы OpenCV - PullRequest
       15

SIFT альтернативы OpenCV

0 голосов
/ 22 апреля 2019

Я написал алгоритм, используя SIFT из старого OpenCV, и он действительно хорошо работает для того, что мне нужно.Однако я понял, что SIFT больше не поддерживается новыми версиями OpenCV.Любые рекомендации о том, что я могу заменить его, чтобы я мог сохранить свой существующий код?Я попытался ORB, но, похоже, он работает по-другому и не может заставить его работать так же.

SIFT / FLANN Stuff

def siftMatcher(image, logoToSearch):
    MIN_MATCH_COUNT = 45
    img1 = logoToSearch
    img2 = image

    # Initiate SIFT detector
    sift = cv2.xfeatures2d.SIFT_create()
    kp1, des1 = sift.detectAndCompute(img1, None)
    kp2, des2 = sift.detectAndCompute(img2, None)
    # FLANN parameters
    FLANN_INDEX_KDTREE = 1
    index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
    search_params = dict(checks=30)
    flann = cv2.FlannBasedMatcher(index_params, search_params)
    matches = flann.knnMatch(des1, des2, k=2)
    # store all the good matches as per Lowe's ratio test.

    mCords = []
    nCords = []
    hasSeen = []

    for m, n in matches:
        if m.distance < 0.65 * n.distance:
            mC = kp2[m.trainIdx].pt
            nC = kp2[n.trainIdx].pt
            if ([mC,nC] in hasSeen or [nC,mC] in hasSeen):
                continue
            mCords.append(mC)
            nCords.append(nC)
            hasSeen.append([mC,nC])
            hasSeen.append([nC,mC])
    symMatches = numberOfSymetricMatches(mCords,nCords)
    return symMatches

Создание счета

degreesTolerance = 2

def numberOfSymetricMatches(mCords,nCords):

    allMatchesCounts = []
    counter1 = 0

    for mCord1 in mCords:
        nCord1 = nCords[counter1]
        counter2 = 0
        tempMatchesCount = 0

        for mCord2 in mCords:
            if (counter1 == counter2):
                counter2 += 1
                continue
            nCord2 = nCords[counter2]

            xDist1 = mCord1[0] - mCord2[0]
            yDist1 = mCord1[1] - mCord2[1]
            angle1 = 0
            if (yDist1 != 0):
                angle1 = math.degrees(math.atan(xDist1/yDist1))

            xDist2 = nCord1[0] - nCord2[0]
            yDist2 = nCord1[1] - nCord2[1]
            angle2 = 0
            if (yDist2 != 0):
                angle2 = math.degrees(math.atan(xDist2/yDist2))

            if (angle1 - degreesTolerance <= angle2 and angle1 + degreesTolerance >= angle2):
                tempMatchesCount += 1
            counter2 += 1

        allMatchesCounts.append(tempMatchesCount)
        counter1 += 1

    meanMatch = 0
    maxMatch = 0

    if (len(allMatchesCounts) != 0):
        meanMatch = mean(allMatchesCounts)
        maxMatch = max(allMatchesCounts)

    numMatches = len(mCords)

    return meanMatch * maxMatch * numMatches

РЕДАКТИРОВАТЬ 1

Объяснение, почему я не могу использовать более старую версию OpenCV

РЕДАКТИРОВАТЬ 2: реализация ORB, которая не дает хороших результатов

# Initiate ORB detector
orb = cv2.ORB_create(10000, 1.2, nlevels=8, edgeThreshold = 5)
kp1, des1 = orb.detectAndCompute(img1, None)
kp2, des2 = orb.detectAndCompute(img2, None)
# FLANN parameters
FLANN_INDEX_KDTREE = 1
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
search_params = dict(checks = 30)
flann = cv2.FlannBasedMatcher(index_params, search_params)
des1 = np.float32(des1)
des2 = np.float32(des2)
bf = cv2.BFMatcher()
matches = bf.knnMatch(des1, des2, k=2)
...