Проблема с imgIdx в классе DMatch с использованием FlannBasedMatcher в Python - PullRequest
0 голосов
/ 10 февраля 2019

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

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

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

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

Однако, когда я сопоставляю изображение, return 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 Ответ

0 голосов
/ 10 февраля 2019

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

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

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

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

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

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)

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

...