@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) и другие.
При необходимости более продвинутой фильтрации совпадений ключевых точек стоит рассмотреть возможность применения более сложных методов, в зависимости от конкретной задачи и особенностей данных.