Сопоставление изображений с использованием bf.match и рисование с использованием cv2.drawMatches Python - PullRequest
0 голосов
/ 12 апреля 2020

Я успешно сопоставил 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...