Visualizzazione post con etichetta Kabsch. Mostra tutti i post
Visualizzazione post con etichetta Kabsch. Mostra tutti i post

mercoledì 8 ottobre 2025

Trasformazione rigida di immagine con algoritmo Kabsch

 Ho un problema...la camera di ripresa di un sistema di monitoraggio, per la quale era presupposta la staticita', si muove...come correggere a posteriore la traslazione e la rotazione?

Si tratta di una trasformazione rigida (solo rototraslazione...gli oggetti in scena non mutano la loro posizione relativa)...questo e' un esempio semplificato

Le due immagini rappresentano lo stesso foglio fotografato da sue posizioni differente. 


Si calcolano le coordinate pixel dei punti rossi nei due fogli (per la calibrazione) ...le coordinate dei punti neri saranno usate per la validazione 

L'algoritmo di Kabsch e' piuttosto intuitivo e si puo' leggere qui 

Nelle matrice A e B sono riportate le coordinate dei punti di calibrazione

La differenza finale e' stata di 2 pixel 

import numpy as np
import cv2

def create_affine_matrix_2x3(R, t, s):
    """
    Create a 2x3 affine transformation matrix for OpenCV.
    M = [s*R | t]
    """
    M = np.zeros((2, 3))
    M[:2, :2] = s * R
    M[:2, 2] = t
    return M

def kabsch_transform(A, B, with_scale=False):
    assert A.shape == B.shape
    N = A.shape[0]
    centroid_A = A.mean(axis=0)
    centroid_B = B.mean(axis=0)
    A_c = A - centroid_A
    B_c = B - centroid_B
    H = A_c.T @ B_c
    U, S, Vt = np.linalg.svd(H)
    R = Vt.T @ U.T
    # fix reflection
    if np.linalg.det(R) < 0:
        Vt[-1,:] *= -1
        R = Vt.T @ U.T
    if with_scale:
        varA = (A_c**2).sum()
        s = S.sum()/varA
    else:
        s = 1.0
    t = centroid_B - s * (R @ centroid_A)
    return R, t, s

A = np.array([[175,218],[528,123],[439,523],[218,726],[554,688]])
B = np.array([[110,263],[457,128],[410,541],[211,768],[543,692]])

print(A)
R, t, s = kabsch_transform(A, B)
print("\nRotation matrix R:")
print(R)
print("\nTranslation vector t:")
print(t)
print("\nScale s:")
print(s)
print("-----------------------------")

A1 = np.array([[218,726],[554,688]])
B1 = np.array([[211,768],[543,693]])

controllo_transformed = s * (A1 @ R.T) + t
print(controllo_transformed)
print(B1)
print("\nDifferenza:")
print(np.abs(controllo_transformed - B1).max())

image = cv2.imread("IMG_8947.jpg")
output_shape = (image.shape[1], image.shape[0])

M = create_affine_matrix_2x3(R, t, s)
transformed = cv2.warpAffine(image, M, output_shape,
                                 flags=cv2.INTER_LINEAR,
                                 borderMode=cv2.BORDER_CONSTANT,
                                 borderValue=0)
cv2.imwrite('finale.jpg',transformed)


 

Microfoni Kinect1

Ho trovato quasi per caso su Internet che il Kinect 1 ha un array di 4 microfoni che permettono di determinare la direzione del suono (ed es...