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

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

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

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

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

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

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

Вот часть моего кода (я немного упростил его, и я знаю, что «тест» не подходит для имени переменной, но это временно). Также здесь я прочитал файлы .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), основываясь на количестве наборов дескрипторов, которые я добавил с помощью метода «добавить».

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

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

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

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

Спасибо.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
437
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

Я думал, что метод «добавить» будет увеличивать количество изображений при вызове, но это не так. Итак, я понял, что мне нужно создать список 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)

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

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