Проблема с imgIdx в классе DMatch с использованием FlannBasedMatcher в Python
У меня та же проблема, что и здесь:
К сожалению, этот пост не имеет ответа.
У меня есть несколько изображений (и соответствующих дескрипторов), которые я добавляю в 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)
Надеюсь это поможет.