Я успешно сопоставил 2 изображения, используя bf.Match
и также нарисовал совпадения. Сейчас я пытаюсь сопоставить несколько изображений из 2 разных каталогов.
Для этого я использую 2 разных массива для хранения изображений из 2 разных каталогов. Кажется, что все работает нормально, и печать массива фактически показывает точки также при печати.
Однако cv2.drawMatches
выдает ошибку TypeError: queryDescriptors не является числовым кортежем при его зацикливании. Я использую в то время как l oop для l oop функцию cv2.drawMatches
и повторяю значения сохраненного массива.
Любая помощь будет более чем заметна.
Ниже приведен мой код, который До сих пор я разработал, чтобы достичь этого:
import matplotlib.pyplot as plt
import os
sift = cv2.xfeatures2d.SIFT_create()
path = 'path_to_directory_1'
files = []
descriptors_1 = []
keypoints_1 = []
keypoints_2 = []
descriptors_2 = []
img1 = []
img2 = []
for r, d, f in os.walk(path):
for file in f:
if '.PNG' in file:
files.append(os.path.join(r, file))
for f in files:
imgtest1 = cv2.imread(f)
imgraw1 = cv2.cvtColor(imgtest1, cv2.COLOR_BGR2RGB)
img1.append(imgraw1)
descriptors_1.append(sift.detectAndCompute(imgraw1,None))
keypoints_1.append(sift.detectAndCompute(imgraw1,None))
path = 'path_to_directory_2'
files = []
for r, d, f in os.walk(path):
for file in f:
if '.PNG' in file:
files.append(os.path.join(r, file))
for f in files:
imgtest2 = cv2.imread(f)
imgraw2 = cv2.cvtColor(imgtest2, cv2.COLOR_BGR2RGB)
img2.append(imgraw2)
descriptors_2.append(sift.detectAndCompute(imgraw2,None))
keypoints_2.append(sift.detectAndCompute(imgraw2,None))
bf = cv2.BFMatcher(cv2.NORM_L1, crossCheck=True)
size = len(descriptors_1)
count = 0
while (count <= size):
print(descriptors_1[count])
count = count + 1
matches = bf.match(descriptors_1[count], descriptors_2[count])
matches = sorted(matches, key = lambda x:x.distance)
img3 = cv2.drawMatches(img1[count], keypoints_1[count], img2[count], keypoints_2[count], matches[:50], img2[count], flags=2)
plt.imshow(img3)
plt.show()