Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import cv2
- import numpy as np
- import time
- # Укажите полный путь к файлам изображений
- path = '/Users/Texnik/Downloads/Новая папка 2/'
- image1_path = path + 'tom ford.jpg' # Замените на имя первого изображения
- image2_path = path + 'tom ford.jpg' # Замените на имя второго изображения
- # Загрузка изображений
- image1 = cv2.imread(image1_path, cv2.IMREAD_GRAYSCALE)
- image2 = cv2.imread(image2_path, cv2.IMREAD_GRAYSCALE)
- # Проверка, загрузились ли изображения
- if image1 is None or image2 is None:
- print("Ошибка загрузки изображений. Проверьте путь.")
- exit()
- # Применение гауссового размытия к изображению 2
- image2_blurred = cv2.GaussianBlur(image2, (5, 5), 0) # Размер ядра (5, 5)
- # Инициализация детектора ORB
- orb = cv2.ORB_create()
- # Детектирование ключевых точек и вычисление дескрипторов для исходного изображения
- keypoints1, descriptors1 = orb.detectAndCompute(image1, None)
- # Детектирование ключевых точек и вычисление дескрипторов для размытых изображений
- keypoints2, descriptors2 = orb.detectAndCompute(image2_blurred, None)
- # Проверка, были ли найдены дескрипторы
- if descriptors1 is None or descriptors2 is None or len(descriptors1) == 0 or len(descriptors2) == 0:
- print("Ошибка: не найдены дескрипторы в одном из изображений.")
- exit()
- # 1. Brute-Force Matcher
- start_time_bf = time.time() # Засекаем время начала для Brute-Force
- bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
- matches_bf = bf.match(descriptors1, descriptors2)
- # Сортировка совпадений по расстоянию
- matches_bf = sorted(matches_bf, key=lambda x: x.distance)
- # Отображение совпадений методом Brute-Force
- image_matches_bf = cv2.drawMatches(image1, keypoints1, image2_blurred, keypoints2, matches_bf[:20], None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
- # Засекаем время окончания для Brute-Force и вычисляем разницу
- end_time_bf = time.time()
- time_bf = end_time_bf - start_time_bf
- print(f"Время выполнения метода Brute-Force: {time_bf:.4f} секунд")
- # 2. FLANN Matcher
- start_time_flann = time.time() # Засекаем время начала для FLANN
- # Параметры FLANN
- index_params = dict(algorithm=6, # FLANN_INDEX_LSH
- table_number=6, # 12
- key_size=12, # 20
- multi_probe_level=1) # 2
- search_params = dict(checks=50) # Увеличьте для большей точности
- # Создание FLANN матчера
- flann = cv2.FlannBasedMatcher(index_params, search_params)
- matches_flann = flann.knnMatch(descriptors1, descriptors2, k=2)
- # Применение теста Лоу
- good_matches_flann = []
- for m, n in matches_flann:
- if m.distance < 0.7 * n.distance:
- good_matches_flann.append(m)
- # Отображение совпадений методом FLANN
- image_matches_flann = cv2.drawMatches(image1, keypoints1, image2_blurred, keypoints2, good_matches_flann[:20], None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
- # Засекаем время окончания для FLANN и вычисляем разницу
- end_time_flann = time.time()
- time_flann = end_time_flann - start_time_flann
- print(f"Время выполнения метода FLANN: {time_flann:.4f} секунд")
- # Вывод количества совпадений для каждого метода
- print(f"Количество совпадений (Brute-Force): {len(matches_bf)}")
- print(f"Количество хороших совпадений (FLANN): {len(good_matches_flann)}")
- # Отображение результатов
- cv2.imshow('Brute-Force Matches', image_matches_bf)
- cv2.imshow('FLANN Matches', image_matches_flann)
- cv2.waitKey(0)
- cv2.destroyAllWindows()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement