Как можно отфильтровать совпадения ключевых точек в OpenCV
Я недавно начал разбираться с OpenCV и сейчас пытаюсь реализовать проверку наличия картинки шаблона в другой картинке.
Сейчас проблема в том, что, матчер находит хорошие совпадения ключевых точек, но не учитывает их расположение относительно друг друга.
Например:
В обоих случаях матчер нашел совпадения ключевых точек, причём правильно, но во втором случае совпадения найдены в разных местах картинки. Хотелось бы обработать эту ситуацию как "шаблон не найден", желательно встроенными функциями OpenCV.
Функция для сравнения ключевых точек:
def keypoint_match(pic, pattern, pic_desc, pattern_desc, drawDebug=False):
bf = cv2.BFMatcher()
matches = bf.knnMatch(pattern_desc[1], pic_desc[1], k=2)
good = []
for m, n in matches:
if (m.distance < 0.75 * n.distance):
good.append(m)
print('Good matches:', len(good))
find = True if len(good) > 10 else False
if drawDebug or find:
image = cv2.drawMatches(np.uint8(pattern), pattern_desc[0], np.uint8(pic), pic_desc[0], good, 0,
flags=0, matchColor=(0, 255, 0), singlePointColor=(255, 0, 0))
plt.figure(figsize=(20, 20))
plt.axis('off')
plt.imshow(image.astype(np.uint8))
plt.show()
return good, find
Результат:
test1.png
Good matches: 32
Pattern found: 'smile.png'
Result: pattern found
test2.png
Good matches: 25
Pattern found: 'smile.png'
Result: pattern found
Тестовые картинки и полный исходный код я разместил здесь.
Ответы (1 шт):
Чтобы проверить относительное расположение ключевых точек, вы можете использовать матрицу гомографии, которая описывает отношения между двумя изображениями. Учитывая набор совпадений между ключевыми точками, вы можете вычислить матрицу гомографии, используя функцию OpenCV cv2.findHomography(). Затем вы можете использовать функцию cv2.perspectiveTransform() для преобразования точек на изображении шаблона в то же место, что и на целевом изображении. Наконец, вы можете проверить, образуют ли преобразованные точки правильный шаблон на целевом изображении, проверив, находятся ли точки в определенном диапазоне или образуют ли они определенную форму. Если шаблон не найден, вы можете вернуть «шаблон не найден». Надеюсь поможет.