import cv2 import kornia.feature as KF import kornia.geometry as KG import matplotlib.pyplot as plt import numpy as np import torch from torchvision.io import decode_image from ripe import vgg_hyper from ripe.utils.utils import cv2_matches_from_kornia, resize_image, to_cv_kpts dev = torch.device("cuda" if torch.cuda.is_available() else "cpu") model = vgg_hyper().to(dev) model.eval() image1 = resize_image(decode_image("assets/all_souls_000013.jpg").float().to(dev) / 255.0) image2 = resize_image(decode_image("assets/all_souls_000055.jpg").float().to(dev) / 255.0) kpts_1, desc_1, score_1 = model.detectAndCompute(image1, threshold=0.5, top_k=2048) kpts_2, desc_2, score_2 = model.detectAndCompute(image2, threshold=0.5, top_k=2048) matcher = KF.DescriptorMatcher("mnn") # threshold is not used with mnn match_dists, match_idxs = matcher(desc_1, desc_2) matched_pts_1 = kpts_1[match_idxs[:, 0]] matched_pts_2 = kpts_2[match_idxs[:, 1]] H, mask = KG.ransac.RANSAC(model_type="fundamental", inl_th=1.0)(matched_pts_1, matched_pts_2) matchesMask = mask.int().ravel().tolist() result_ransac = cv2.drawMatches( (image1.cpu().permute(1, 2, 0).numpy() * 255.0).astype(np.uint8), to_cv_kpts(kpts_1, score_1), (image2.cpu().permute(1, 2, 0).numpy() * 255.0).astype(np.uint8), to_cv_kpts(kpts_2, score_2), cv2_matches_from_kornia(match_dists, match_idxs), None, matchColor=(0, 255, 0), matchesMask=matchesMask, # matchesMask=None, # without RANSAC filtering singlePointColor=(0, 0, 255), flags=cv2.DrawMatchesFlags_DEFAULT, ) plt.imshow(result_ransac) plt.axis("off") plt.tight_layout() # plt.show() plt.savefig("result_ransac.png")