Impara OpenCV

La Torre di Babele, secondo un racconto mitico della Bibbia, fu il primo disastro ingegneristico degli uomini. Il progetto aveva tutte le grandi qualità di avere una missione chiara, molto potere umano, nessun vincolo di tempo e una tecnologia adeguata (mattoni e malta). Eppure fallì spettacolarmente perché Dio confuse la lingua degli operai umani ed essi non riuscirono più a comunicare.

Termini come “Omografia” mi ricordano spesso come noi lottiamo ancora con la comunicazione. L’omografia è un concetto semplice con un nome strano!

Che cos’è l’omografia?

Considerate due immagini di un piano (in cima al libro) mostrate nella figura 1. Il punto rosso rappresenta lo stesso punto fisico nelle due immagini. Nel gergo della computer vision li chiamiamo punti corrispondenti. La figura 1. mostra quattro punti corrispondenti in quattro colori diversi – rosso, verde, giallo e arancione. Un’omografia è una trasformazione (una matrice 3×3) che mappa i punti in un’immagine ai punti corrispondenti nell’altra immagine.

Figura 1 : Due immagini di un piano 3D (in cima al libro) sono correlate da un’omografia

Ora, poiché un’omografia è una matrice 3×3, possiamo scriverla come

Consideriamo il primo set di punti corrispondenti – nella prima immagine e nella seconda immagine. Poi, l’omografia li mappa nel modo seguente

Image Alignment Using Homography

L’equazione di cui sopra è vera per TUTTI gli insiemi di punti corrispondenti, purché si trovino sullo stesso piano nel mondo reale. In altre parole puoi applicare l’omografia alla prima immagine e il libro nella prima immagine sarà allineato con il libro nella seconda immagine! Vedi Figura 2.

Figura 2 : Un’immagine di un piano 3D può essere allineata con un’altra immagine dello stesso piano usando l’omografia

Ma che dire dei punti che non sono sul piano? Bene, essi NON saranno allineati da un’omografia come si può vedere nella figura 2. Ma aspetta, e se ci sono due piani nell’immagine? Bene, allora hai due omografie – una per ogni piano.

Panorama: un’applicazione dell’omografia

Nella sezione precedente, abbiamo imparato che se un’omografia tra due immagini è nota, possiamo deformare un’immagine sull’altra. Tuttavia, c’era un grande avvertimento. Le immagini dovevano contenere un piano (la parte superiore di un libro), e solo la parte planare era allineata correttamente. Si è scoperto che se si scatta una foto di qualsiasi scena (non solo un piano) e poi si scatta una seconda foto ruotando la fotocamera, le due immagini sono correlate da un’omografia! In altre parole, puoi montare la tua macchina fotografica su un treppiede e scattare una foto. Poi, falla ruotare intorno all’asse verticale e scatta un’altra foto. Le due immagini appena scattate di una scena 3D completamente arbitraria sono correlate da un’omografia. Le due immagini condivideranno alcune regioni comuni che possono essere allineate e cucite e bingo avrete un panorama di due immagini. È davvero così facile? No! (mi dispiace deludervi) C’è molto di più nella creazione di un buon panorama, ma il principio di base è quello di allineare usando un’omografia e cucire in modo intelligente in modo da non vedere le cuciture. La creazione di panorami sarà sicuramente parte di un futuro post.

Come calcolare un’omografia?

Per calcolare un’omografia tra due immagini, è necessario conoscere almeno 4 corrispondenze di punti tra le due immagini. Se avete più di 4 punti corrispondenti, è ancora meglio. OpenCV stima in modo robusto un’omografia che si adatta meglio a tutti i punti corrispondenti. Di solito, queste corrispondenze di punti vengono trovate automaticamente abbinando caratteristiche come SIFT o SURF tra le immagini, ma in questo post faremo semplicemente clic sui punti a mano.

Guardiamo prima l’utilizzo.

C++

Python

Guardiamo un esempio più completo sia in C++ che in Python.

OpenCV C++ Homography Example

Le immagini in Figura 2. possono essere generate usando il seguente codice C++. Il codice seguente mostra come prendere quattro punti corrispondenti in due immagini e deformare l’immagine sull’altra.

OpenCV Python Homography Example

Le immagini in Figura 2. possono anche essere generate usando il seguente codice Python. Il codice qui sotto mostra come prendere quattro punti corrispondenti in due immagini e deformare l’immagine sull’altra.

Applicazioni dell’Omografia

L’applicazione più interessante dell’Omografia è senza dubbio la realizzazione di panorami ( a.k.a. image mosaicing e image stitching ). I panorami saranno l’argomento di un post successivo. Vediamo alcune altre applicazioni interessanti.

Correzione della prospettiva usando l’omografia

Figura 3. Correzione prospettica

Diciamo che hai una foto mostrata nella Figura 1. Non sarebbe bello se si potesse cliccare sui quattro angoli del libro e ottenere rapidamente un’immagine simile a quella mostrata nella Figura 3. Potete ottenere il codice per questo esempio nella sezione download qui sotto. Ecco i passi.

  1. Scrivete un’interfaccia utente per raccogliere i quattro angoli del libro. Chiamiamo questi punti pts_src
  2. Abbiamo bisogno di conoscere l’aspect ratio del libro. Per questo libro, l’aspect ratio ( larghezza / altezza ) è 3/4. Quindi possiamo scegliere che la dimensione dell’immagine di uscita sia 300×400, e che i nostri punti di destinazione ( pts_dst ) siano (0,0), (299,0), (299,399) e (0,399)
  3. Otteniamo l’omografia usando pts_src e pts_dst .
  4. Applichiamo l’omografia all’immagine sorgente per ottenere l’immagine in Figura 3.
Puoi scaricare il codice e le immagini usate in questo post iscrivendoti alla nostra newsletter qui.

Cartellone virtuale

In molti eventi sportivi televisivi, la pubblicità viene virtualmente inserita nel feed video live. Ad esempio, nel calcio e nel baseball gli annunci posizionati su piccoli tabelloni pubblicitari proprio al di fuori del confine del campo possono essere cambiati virtualmente. Invece di mostrare lo stesso annuncio a tutti, gli inserzionisti possono scegliere quali annunci mostrare in base ai dati demografici della persona, alla posizione ecc. In queste applicazioni i quattro angoli del tabellone pubblicitario sono rilevati nel video che servono come punti di destinazione. I quattro angoli dell’annuncio servono come punti di origine. Un’omografia viene calcolata sulla base di questi quattro punti corrispondenti e viene utilizzata per deformare l’annuncio nel fotogramma video.

Dopo aver letto questo post probabilmente avrete un’idea su come mettere un’immagine su un cartellone virtuale. La figura 4. mostra la prima immagine caricata su internet.

Figura 4. Prima immagine caricata su internet.

E la figura 5. mostra Times Square.

Figura 5. The Times Square
Puoi scaricare il codice (C++ & Python) e le immagini usate in questo esempio e negli altri esempi di questo post iscrivendoti alla nostra newsletter qui.

Possiamo sostituire uno dei cartelloni su Times Square con un’immagine a nostra scelta. Ecco i passi.

  1. Scriviamo un’interfaccia utente per raccogliere i quattro angoli del cartellone nell’immagine. Chiamiamo questi punti pts_dst
  2. Lasciate che la dimensione dell’immagine che volete mettere sul cartellone virtuale sia w x h. Gli angoli dell’immagine ( pts_src ) devono quindi essere (0,0), (w-1,0), (w-1,h-1) e (0,h-1)
  3. Ottieni l’omografia usando pts_src e pts_dst .
  4. Applica l’omografia all’immagine sorgente e fondila con l’immagine di destinazione per ottenere l’immagine in Figura 6.

Nota nella Figura 6. abbiamo inserito l’immagine mostrata in Figura 4. nell’immagine di Times Square.

Figura 6. Cartellone virtuale. Uno dei cartelloni sul lato sinistro è stato sostituito con un’immagine di nostra scelta.

Iscriviti &Scarica il codice

Se ti è piaciuto questo articolo e vuoi scaricare il codice (C++ e Python) e le immagini di esempio usate in questo post, iscriviti alla nostra newsletter. Riceverai anche una guida gratuita alle risorse di Computer Vision. Nella nostra newsletter condividiamo tutorial ed esempi di OpenCV scritti in C++/Python, e algoritmi di Computer Vision e Machine Learning e notizie.

Subscribe Now

Image Credits

  1. L’immagine in Figura 4. è stata la prima immagine fotografica caricata su internet. Si qualifica come fair use.
  2. L’immagine usata nella Figura 5. ( The Time Square ) è rilasciata sotto licenza GFDL.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.