Я написал алгоритм, используя 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)