Opencv BFMatcher для нескольких изображений - PullRequest
0 голосов
/ 22 сентября 2018

Я хочу выполнить сопоставление функций Brute Force SIFT в Python с opencv.

Я нашел следующий код в документации opencv.

import numpy as np
import cv2
from matplotlib import pyplot as plt

img1 = cv2.imread('box.png',0)          # queryImage
img2 = cv2.imread('box_in_scene.png',0) # trainImage

# Initiate SIFT detector
sift = cv2.SIFT()

# find the keypoints and descriptors with SIFT
kp1, des1 = sift.detectAndCompute(img1,None)
kp2, des2 = sift.detectAndCompute(img2,None)

# BFMatcher with default params
bf = cv2.BFMatcher()
matches = bf.knnMatch(des1,des2, k=2)

# Apply ratio test
good = []
for m,n in matches:
    if m.distance < 0.75*n.distance:
        good.append([m])

# cv2.drawMatchesKnn expects list of lists as matches.
img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,flags=2)

plt.imshow(img3),plt.show()

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

1 Ответ

0 голосов
/ 22 сентября 2018

BFMatcher работает только для двух дескрипторов одновременно.Если вы посмотрите документацию здесь: https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_feature2d/py_matcher/py_matcher.html

Подбор грубой силы прост.Он принимает дескриптор одного объекта в первом наборе и сопоставляется со всеми другими объектами во втором наборе с использованием некоторого вычисления расстояния.И самый близкий возвращается.

Я совершенно не уверен, что вы подразумеваете под несколькими дескрипторами.Однако я знаю, что вы можете взять дескриптор из image1, соответствующий image2.Затем сопоставьте image1 с image3.Наконец, изображение2 с изображением3.Сопоставление дескрипторов нескольких изображений необходимо выполнить вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...