sabato 28 dicembre 2024

Feature Matching OpenCv

Il problema e' il seguente: trovare le differenze tra le due foto. Le due immagini sono state riprese a distanza di oltre un anno ed il punto di ripresa non e' esattamente il solito per cui c'e' un effetto di traslazione e rotazione seppure non immediatamente

Prima

Dopo

Con lo script sottostante sono state estratte le feature tramite AKAZE e successivamente sono state matchate e filtrate in base alla distanza tramite FLANN

E' stata calcolata la distanza in pixel tra il punto nella prima immagine ed il suo omologo nella seconda sottraendo un valore costante derivante (1000) e colorando il punto secondo la scala colore da verde a rosso a secondo dell'intensita' di movimento

import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np
import math

originale = cv.imread(filename = 'prima.png')
originale2 = cv.imread(filename = 'prima.png')

image1 = cv.imread(filename = 'prima.png',flags = cv.IMREAD_GRAYSCALE)
image2 = cv.imread(filename = 'dopo.png',flags = cv.IMREAD_GRAYSCALE)
AKAZE = cv.AKAZE_create()

# Find the keypoints and compute the descriptors for input and training-set image
keypoints1, descriptors1 = AKAZE.detectAndCompute(image1, None)
keypoints2, descriptors2 = AKAZE.detectAndCompute(image2, None)

# FLANN parameters
FLANN_INDEX_KDTREE = 1

index_params = dict(algorithm = FLANN_INDEX_KDTREE,trees = 5)
search_params = dict(checks = 50)

# Convert to float32
descriptors1 = np.float32(descriptors1)
descriptors2 = np.float32(descriptors2)

# Create FLANN object
FLANN = cv.FlannBasedMatcher(indexParams = index_params,searchParams = search_params)

# Matching descriptor vectors using FLANN Matcher
matches = FLANN.knnMatch(queryDescriptors = descriptors1,
trainDescriptors = descriptors2,
k = 2)

ratio_thresh = 0.7
good_matches = []
for m, n in matches:
if m.distance < ratio_thresh * n.distance:
distanza = math.sqrt(pow((keypoints1[m.queryIdx].pt[0] - keypoints2[n.trainIdx].pt[0]), 2) + pow((keypoints1[m.queryIdx].pt[1] - keypoints2[n.trainIdx].pt[1]), 2))
distanza = distanza - 1000
colore = (0, 0, 0)
if (distanza <500.0):
colore = (73, 245, 109)
if (distanza >= 500) and (distanza <1000):
colore = (90, 248, 98)
if (distanza >= 1000) and (distanza <1500):
colore = (154, 244, 87)
if (distanza >= 1500) and (distanza <2000):
colore = (228, 178, 45)
if (distanza >= 2000) and (distanza <2500):
colore = (248, 38, 49)
if distanza >= 2500.0 :
colore = (255, 0, 27)
#print(m.distance)
cv.circle(originale, (int(keypoints2[m.trainIdx].pt[0]), int(keypoints2[m.trainIdx].pt[1])), 15, colore, -1)
good_matches.append(m)


plt.imshow(originale)
plt.show()














Nessun commento:

Posta un commento

Feature Matching OpenCv

Il problema e' il seguente: trovare le differenze tra le due foto. Le due immagini sono state riprese a distanza di oltre un anno ed il ...