Opencv praticamente fotocamera che ruota / traduce per la vista a volo d’uccello

Ho una fotocamera calibrata in cui conosco esattamente i dati intrinseci ed estrinseci. È anche nota l’altezza della fotocamera. Ora voglio ruotare virtualmente la telecamera per ottenere una vista a volo d’uccello, in modo da poter build la matrice di omografia con i tre angoli di rotazione e la traduzione.

So che 2 punti possono essere trasformati da un’immagine all’altra tramite Homography as

x = K * (Rt * n / d) K ^ -1 * x ‘

ci sono alcune cose che vorrei sapere ora: se voglio riportare la coordinata dell’immagine in ccs, devo moltiplicarla con K ^ -1, giusto? Come coordinata immagine uso (x ‘, y’, 1)?

Quindi ho bisogno di build una matrice di rotazione per far girare il ccs … ma quale convenzione dovrei usare? E come faccio a sapere come impostare il mio WCS?

    La prossima cosa è la normale e la distanza. È giusto prendere solo tre punti distesi a terra e calcolare il normale da loro? ed è la distanza quindi l’altezza della telecamera?

    Inoltre mi piacerebbe sapere come posso cambiare l’altezza della telecamera a vista dell’uccello, praticamente simile, così posso dire che voglio vedere il piano terra da un’altezza di 3 metri. Come posso usare l’unità “metro” nella matrice di traduzione e omografia?

    Per ora, per ora, sarebbe bello se qualcuno potesse illuminarmi e aiutarmi. E per favore non suggerire di generare la vista dell’uccello con “getperspective”, l’ho già provato, ma in questo modo non è adatto a me.

    Senna

    Questo è il codice che consiglierei (è uno dei miei), a mio avviso risponde a molte tue domande, Se vuoi la distanza, preciserei che è nella matrice Z, il coefficiente (4,3).

    Spero ti possa aiutare …

    Mat source=imread("Whatyouwant.jpg"); int alpha_=90., beta_=90., gamma_=90.; int f_ = 500, dist_ = 500; Mat destination; string wndname1 = getFormatWindowName("Source: "); string wndname2 = getFormatWindowName("WarpPerspective: "); string tbarname1 = "Alpha"; string tbarname2 = "Beta"; string tbarname3 = "Gamma"; string tbarname4 = "f"; string tbarname5 = "Distance"; namedWindow(wndname1, 1); namedWindow(wndname2, 1); createTrackbar(tbarname1, wndname2, &alpha_, 180); createTrackbar(tbarname2, wndname2, &beta_, 180); createTrackbar(tbarname3, wndname2, &gamma_, 180); createTrackbar(tbarname4, wndname2, &f_, 2000); createTrackbar(tbarname5, wndname2, &dist_, 2000); imshow(wndname1, source); while(true) { double f, dist; double alpha, beta, gamma; alpha = ((double)alpha_ - 90.)*PI/180; beta = ((double)beta_ - 90.)*PI/180; gamma = ((double)gamma_ - 90.)*PI/180; f = (double) f_; dist = (double) dist_; Size taille = source.size(); double w = (double)taille.width, h = (double)taille.height; // Projection 2D -> 3D matrix Mat A1 = (Mat_(4,3) << 1, 0, -w/2, 0, 1, -h/2, 0, 0, 0, 0, 0, 1); // Rotation matrices around the X,Y,Z axis Mat RX = (Mat_(4, 4) << 1, 0, 0, 0, 0, cos(alpha), -sin(alpha), 0, 0, sin(alpha), cos(alpha), 0, 0, 0, 0, 1); Mat RY = (Mat_(4, 4) << cos(beta), 0, -sin(beta), 0, 0, 1, 0, 0, sin(beta), 0, cos(beta), 0, 0, 0, 0, 1); Mat RZ = (Mat_(4, 4) << cos(gamma), -sin(gamma), 0, 0, sin(gamma), cos(gamma), 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); // Composed rotation matrix with (RX,RY,RZ) Mat R = RX * RY * RZ; // Translation matrix on the Z axis change dist will change the height Mat T = (Mat_(4, 4) << 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, dist, 0, 0, 0, 1); // Camera Intrisecs matrix 3D -> 2D Mat A2 = (Mat_(3,4) << f, 0, w/2, 0, 0, f, h/2, 0, 0, 0, 1, 0); // Final and overall transformation matrix Mat transfo = A2 * (T * (R * A1)); // Apply matrix transformation warpPerspective(source, destination, transfo, taille, INTER_CUBIC | WARP_INVERSE_MAP); imshow(wndname2, destination); waitKey(30); } 

    Questo codice funziona per me ma non so perché vengono scambiati gli angoli Roll e Pitch. Quando cambio “alpha”, l’immagine è deformata in altezza e quando cambio “beta” l’immagine è deformata in rotolo. Così, ho cambiato la mia matrice di rotazione, come si può vedere sotto.

    Inoltre, il RY ha un errore di segnale. Puoi controllare Ry a: http://en.wikipedia.org/wiki/Rotation_matrix .

    I metrix di rotazione che utilizzo:

     Mat RX = (Mat_(4, 4) << 1, 0, 0, 0, 0, cos(beta), -sin(beta), 0, 0, sin(beta), cos(beta), 0, 0, 0, 0, 1); Mat RY = (Mat_(4, 4) << cos(alpha), 0, sin(alpha), 0, 0, 1, 0, 0, -sin(alpha), 0, cos(alpha), 0, 0, 0, 0, 1); Mat RZ = (Mat_(4, 4) << cos(gamma), -sin(gamma), 0, 0, sin(gamma), cos(gamma), 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); 

    Saluti