Проблема с imgIdx в классе DMatch с использованием FlannBasedMatcher в Python

У меня та же проблема, что и здесь:

как получить лучшее изображение, соответствующее наилучшему совпадению ключевых точек, используя opencv flannbasedmatcher и dmatch

К сожалению, этот пост не имеет ответа.

У меня есть несколько изображений (и соответствующих дескрипторов), которые я добавляю в FlannBasedMatcher, используя метод add (один раз для каждого набора дескрипторов, соответствующих одному изображению).

Однако, когда я сопоставляю изображение, возвращаемый imgIdx намного больше, чем количество изображений в обучающем наборе. Я чувствую, что каждый дескриптор рассматривается как изображение, но это не то, что я хочу.

Я хочу знать, какому изображению (или набору дескрипторов) соответствует каждая функция.

Вот часть моего кода (я немного упростил его, и я знаю, что 'test' не подходит для имени переменной, но он временный). Также здесь я читаю файлы.key, которые в основном представляют собой файлы, содержащие ключевые точки и дескрипторы изображения (извлеченные с помощью SIFT).

Я просто уточнил, что в следующем коде featMatch - это просто класс, который я создал для создания FlannBasedMatcher (с параметрами инициализации).

with open(os.path.join(ROOT_DIR,"images\\descriptor_list.txt"),'r') as f:
    for line in f:
        folder_path = os.path.join(ROOT_DIR,"images\\",line[:-1]+"\\","*.key")
        list_key = glob.glob(folder_path)

        test2 = []
        for key in list_key:
            if os.path.isfile(key):
                feat = Features()
                feat.readFromFile(key)
                test = feat.descriptors
                test2 = test2+test
         featMatch.add(test2)

# Read submitted picture features
feat = Features()
feat.readFromFile(os.path.join(ROOT_DIR,"submitted_picture\\sub.key"))
matches = []
matches.append(featMatch.knnMatch(np.array(feat.descriptors), k=3))
print(matches)

Я ожидал, когда смотрю на совпадения, а точнее на imgIdx совпадений, скажем, какому индексу изображения соответствует функция сопоставления (trainIdx), основываясь на количестве наборов дескрипторов, которые я добавил с помощью метода add .

Но, следуя этому предположению, я должен иметь возможность иметь значение imgIdx больше, чем количество изображений (или наборов тренировок) в моем тренировочном наборе.

Однако здесь я получаю такие числа, как 2960, в то время как в моем тренировочном наборе у меня всего около 5 изображений.

Я предполагаю, что он возвращает индекс функции вместо индекса изображения, но я не знаю почему.

Я заметил, что метод "add" в C++ принимает массив массивов, где у нас есть список наборов дескрипторов (я думаю, по одному для каждого изображения). Но здесь у меня разное количество функций для каждого изображения, поэтому я не могу создать массив с разным количеством строк в каждом столбце.

Благодарю.

1 ответ

Решение

Я наконец-то понял это после просмотра исходного кода C++ для matcher.cpp:

https://github.com/opencv/opencv/blob/master/modules/features2d/src/matchers.cpp

Я опубликую ответ, на случай, если он кому-нибудь понадобится.

Я думал, что метод 'add' будет увеличивать количество изображений при вызове, но это не так. Итак, я понял, что мне нужно создать список Mat (или массива numpy в python) и дать его один раз для добавления, вместо того, чтобы вызывать его для каждого изображения.

Итак, вот обновленный (и работающий) исходный код:

with open(os.path.join(ROOT_DIR,"images\\descriptor_list.txt"),'r') as f:
    list_image_descriptors = []
    for line in f:
        folder_path = os.path.join(ROOT_DIR,"images\\",line[:-1]+"\\","*.key")
        list_key = glob.glob(folder_path)

        for key in list_key:
            if os.path.isfile(key):
                feat = Features()
                feat.readFromFile(key)
                img_descriptors = np.array(feat.descriptors)
        list_image_descriptors.append(img_descriptors)
     featMatch.add(list_image_descriptors)

# Read submitted picture features
feat = Features()
feat.readFromFile(os.path.join(ROOT_DIR,"submitted_picture\\sub.key"))
matches = []
matches.append(featMatch.knnMatch(np.array(feat.descriptors), k=3))
print(matches)

Надеюсь это поможет.

Другие вопросы по тегам