@delphine_bartoletti
Для фильтрации совпадений ключевых точек в OpenCV можно использовать различные методы. Одним из наиболее распространенных является метод RANSAC (Random Sample Consensus), который позволяет удалить выбросы и сохранить только совпадения с высокой степенью уверенности.
Вот пример простого кода, который демонстрирует фильтрацию совпадений ключевых точек с использованием метода RANSAC:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
import cv2 import numpy as np def filter_matches(keypoints1, keypoints2, matches, distance_threshold=40): filtered_matches = [] for match in matches: pt1 = keypoints1[match.queryIdx].pt pt2 = keypoints2[match.trainIdx].pt distance = np.linalg.norm(np.array(pt1) - np.array(pt2)) if distance < distance_threshold: filtered_matches.append(match) return filtered_matches # Загрузка изображений image1 = cv2.imread('image1.jpg', 0) image2 = cv2.imread('image2.jpg', 0) # Создание объектов детектора и дескриптора detector = cv2.ORB_create() matcher = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) # Нахождение ключевых точек и дескрипторов на обоих изображениях keypoints1, descriptors1 = detector.detectAndCompute(image1, None) keypoints2, descriptors2 = detector.detectAndCompute(image2, None) # Сопоставление дескрипторов на обоих изображениях matches = matcher.match(descriptors1, descriptors2) # Фильтрация совпадений ключевых точек filtered_matches = filter_matches(keypoints1, keypoints2, matches) # Отрисовка совпадений на изображении result_image = cv2.drawMatches(image1, keypoints1, image2, keypoints2, filtered_matches, None, flags=2) # Отображение результата cv2.imshow('Filtered Matches', result_image) cv2.waitKey(0) cv2.destroyAllWindows() |
В этом коде используется детектор и дескриптор ORB для нахождения ключевых точек и их дескрипторов на обоих изображениях. Затем используется сопоставитель BFMatcher с использованием меры Хэмминга. После этого выполняется фильтрация совпадений с помощью функции filter_matches
, которая принимает ключевые точки, сопоставления и пороговое значение расстояния. Затем отфильтрованные совпадения отображаются на изображении с помощью drawMatches
.
@delphine_bartoletti
Данный пример демонстрирует простой принцип фильтрации совпадений ключевых точек с помощью метода RANSAC в OpenCV. Однако, следует учитывать, что существуют и другие методы фильтрации, такие как фильтрация по эпиполярным ограничениям (например, с использованием фундаментальной матрицы), фильтрация по геометрии (например, с помощью гомографии), фильтрация по дескрипторам (например, с использованием метода Lowe’s Ratio Test) и другие.
При необходимости более продвинутой фильтрации совпадений ключевых точек стоит рассмотреть возможность применения более сложных методов, в зависимости от конкретной задачи и особенностей данных.