2012-01-27 13 views
9

Ho una mesh di, diciamo, 11 x 11 vertici. L'idea è che ogni punto (vertice) mantiene la posizione in virgola mobile normalizzata di quel pixel nell'immagine deformata. Per esempio. se voglio allungare il bordo in alto a sinistra, scrivo nel primo vertice (-0.1, -0.1).Come si usa cv :: rimappa con mesh in avanti, non in reverse mesh, per deformare le immagini?

Ho la griglia, ma non la funzione di deformazione dell'immagine. cv::remap fa esattamente questo ... ma nell'ordine inverso - la mesh "dice" quali quartieri di pixel mappare su una griglia regolare sull'output.

C'è un modo standard in OpenCV per gestire la deformazione inversa? Posso trasformare facilmente la mesh o usare un'altra funzione? Sto usando OpenCV e Boost, ma qualsiasi libreria/strumento libero funzionerà per me.

PS: Ho bisogno di questo in esecuzione su un PC Linux.

+0

Ho risolto il mio problema. La questione era davvero urgente, così ho attirato la gente in ufficio, fino a quando non è stata trovata una soluzione (una proprietaria, ahimè). Tuttavia, sono ancora molto perplesso sul perché un tale problema (l'immagine che si deforma attraverso una griglia di avanzamento) non sia stato risolto in modo aperto, libero e accessibile. – Vorac

+0

Potresti fornire alcuni dettagli come hai risolto il problema? – Marcin

+0

@Marcin, sfortunatamente il ragazzo EGL ha scritto un mappatore inverso per il dispositivo in forse una settimana (questo è ciò che intendevo per "soluzione proprietaria"). Ancora mi imbarazza il motivo per cui tale funzionalità non è inclusa in OpenCV. Forse un giorno qualcuno risolverà il problema e posterà un riferimento alla richiesta di pull qui come risposta. Forse io, hmmmmm, o tu. – Vorac

risposta

1

È necessario calcolare un'altra mappa per la trasformazione inversa.

Ma, per questo è necessaria la formula di trasformazione o matrice.

Passaggio 1: Selezionare 4 punti sull'immagine rimappata. Una buona idea sarebbe quella di prendere le curve, se gli angoli sono non nero (undefined)

Fase 2: trovare il loro posto nell'immagine originale (esaminare le mappe per questo)

Fase 3 : Calcola l'omografia tra i due insiemi di punti. findHomoraphy() è la chiave.

Punto 4: warpPerspective the second image. Internamente, calcola le griglie, quindi chiama rimappa();

Se si ha la stessa trasformazione di prima, inverte i punti di input con i punti di uscita in findHomography o inv() la matrice risultante.

Se si desidera avere le mappe per più chiamate (è più veloce di chiamare warpPerspective ogni volta), è necessario copiare il codice da warpPerspective in una nuova funzione.

+0

Ciao, vasile e grazie per la risposta. Penso che non sia quello che sto cercando, in quanto riduce i gradi di libertà. Spiegherò - la mesh è arbitraria e non vi sono vincoli di linee rette nell'immagine originale da proiettare in linee rette nel risultato. – Vorac

+0

Hmmm, la mia soluzione funziona solo per le trasformazioni descritte da una relazione geometrica: una trasformazione 3D.Se la mesh descrive una distorsione della lente fish-eye, o qualcosa del genere, l'unica soluzione è scrivere una funzione che prende la mesh di input e crea l'output come una funzione inversa. – Sam

+0

Sì, ancora più generale: le posizioni dei nodi mesh sono piuttosto arbitrarie. Risulta una funzione alternativa a quella in Opencv, ma che accetta warp forward-mapped è "facilmente" implementata in OpenGL - "solo" circa il lavoro di una settimana. Un'altra soluzione proposta era quella di scrivere una funzione di questo tipo che si menziona - alcune interpolazioni bilineari sulla griglia di output (non rettangolare), per trovare le corrispondenti coordinate della griglia di input. – Vorac