Leer OpenCV

De Toren van Babel, volgens een mythisch verhaal in de Bijbel, was de eerste technische ramp van de mensheid. Het project had alle goede eigenschappen van een duidelijke missie, veel mankracht, geen tijdsdruk en adequate technologie (bakstenen en mortel). Toch mislukte het spectaculair omdat God de taal van de menselijke werkers verwarde en zij niet meer konden communiceren.

Termen als “Homografie” herinneren mij er vaak aan hoe wij nog steeds worstelen met communicatie. Homografie is een eenvoudig begrip met een vreemde naam!

Wat is homografie?

Zie twee afbeeldingen van een vlak (bovenkant van het boek) in figuur 1. De rode stip vertegenwoordigt hetzelfde fysieke punt in de twee afbeeldingen. In computer vision jargon noemen we dit corresponderende punten. Figuur 1. toont vier corresponderende punten in vier verschillende kleuren – rood, groen, geel en oranje. Een homografie is een transformatie ( een 3×3 matrix ) die de punten in het ene beeld in kaart brengt met de corresponderende punten in het andere beeld.

Figuur 1 : Twee beelden van een 3D-vlak ( bovenkant van het boek ) zijn aan elkaar gerelateerd door een homografie

Nu, aangezien een homografie een 3×3 matrix is, kunnen we deze schrijven als

Laten we de eerste set corresponderende punten – in het eerste beeld en in het tweede beeld – in beschouwing nemen. De homografie brengt ze op de volgende manier in kaart

Afbeelding uitlijnen met behulp van homografie

De bovenstaande vergelijking geldt voor ALLE reeksen overeenkomstige punten, zolang ze in de echte wereld op hetzelfde vlak liggen. Met andere woorden, je kunt de homografie toepassen op de eerste afbeelding en het boek in de eerste afbeelding zal worden uitgelijnd met het boek in de tweede afbeelding! Zie figuur 2.

Figuur 2 : Een afbeelding van een 3D-vlak kan worden uitgelijnd met een andere afbeelding van hetzelfde vlak met behulp van homografie

Maar hoe zit het met punten die niet op het vlak liggen? Wel, die worden NIET uitgelijnd door een homografie, zoals u kunt zien in figuur 2. Maar wacht eens, wat als er twee vlakken in het beeld zijn? Dan heb je twee homografieën – één voor elk vlak.

Panorama : Een toepassing van homografie

In het vorige deel hebben we geleerd dat als er een homografie tussen twee afbeeldingen bekend is, we de ene afbeelding op de andere kunnen krommen. Er was echter één groot nadeel. De afbeeldingen moesten een vlak bevatten ( de bovenkant van een boek ), en alleen het vlakke deel werd goed uitgelijnd. Het blijkt dat als je een foto neemt van een willekeurig tafereel (niet alleen een vlak) en dan een tweede foto neemt door de camera te draaien, de twee beelden aan elkaar gerelateerd zijn door een homografie! Met andere woorden, je kunt je camera op een statief zetten en een foto nemen. Vervolgens draai je de camera om de verticale as en maak je nog een foto. De twee beelden die je net hebt genomen van een volledig willekeurig 3D tafereel zijn aan elkaar gerelateerd door een homografie. De twee beelden delen enkele gemeenschappelijke gebieden die kunnen worden uitgelijnd en aan elkaar geplakt en bingo je hebt een panorama van twee beelden. Is het echt zo gemakkelijk ? Nope! (sorry dat ik je teleurstel) Er komt heel wat meer kijken bij het maken van een goed panorama, maar het basisprincipe is om uit te lijnen met behulp van een homografie en intelligent te stikken zodat je de naden niet ziet. Het maken van panorama’s zal zeker deel uitmaken van een toekomstige post.

Hoe bereken je een homografie ?

Om een homografie tussen twee afbeeldingen te berekenen, moet je minstens 4 punt correspondenties tussen de twee afbeeldingen weten. Als je meer dan 4 overeenkomstige punten hebt, is het nog beter. OpenCV zal op een robuuste manier een homografie schatten die het best past bij alle overeenkomstige punten. Gewoonlijk worden deze punten automatisch gevonden door kenmerken zoals SIFT of SURF tussen de afbeeldingen te matchen, maar in dit bericht gaan we de punten gewoon met de hand aanklikken.

Laten we eerst eens kijken naar het gebruik.

C++

Python

Laten we eens kijken naar een meer compleet voorbeeld in zowel C++ als Python.

OpenCV C++ Homografie Voorbeeld

De afbeeldingen in figuur 2. kunnen worden gegenereerd met behulp van de volgende C++ code. De onderstaande code laat zien hoe je vier overeenkomstige punten in twee afbeeldingen neemt en de afbeelding op de andere scheeftrekt.

OpenCV Python Homography Example

De afbeeldingen in figuur 2. kunnen ook worden gegenereerd met behulp van de volgende Python-code. De code hieronder laat zien hoe je vier overeenkomstige punten in twee afbeeldingen kunt nemen en de afbeelding op de andere kunt kromtrekken.

Toepassingen van homografie

De meest interessante toepassing van homografie is ongetwijfeld het maken van panorama’s (ook wel image mosaicing en image stitching genoemd). Panorama’s zullen het onderwerp zijn van een latere post. Laten we enkele andere interessante toepassingen bekijken.

Perspectiefcorrectie met behulp van homografie

Figuur 3. Perspectiefcorrectie

Laten we zeggen dat we een foto hebben uit figuur 1. Zou het niet cool zijn als je op de vier hoeken van het boek kon klikken om snel een afbeelding te krijgen die lijkt op die in afbeelding 3? Je kunt de code voor dit voorbeeld downloaden in de download sectie hieronder. Hier zijn de stappen.

  1. Schrijf een gebruikersinterface om de vier hoeken van het boek te verzamelen. Laten we deze punten pts_src noemen
  2. We moeten de hoogte-breedte verhouding van het boek weten. Voor dit boek is de beeldverhouding ( breedte / hoogte ) 3/4. Dus kunnen we de grootte van de output afbeelding kiezen als 300×400, en onze bestemmingspunten ( pts_dst ) als (0,0), (299,0), (299,399) en (0,399)
  3. Opstellen van de homografie met behulp van pts_src en pts_dst .
  4. Toepassen van de homografie op de bronafbeelding om de afbeelding in figuur 3 te verkrijgen.
U kunt de code en afbeeldingen die in dit bericht zijn gebruikt downloaden door u hier op onze nieuwsbrief te abonneren.

Virtual Billboard

In veel op televisie uitgezonden sportevenementen wordt reclame virtueel ingevoegd in live video feed. B.v. in voetbal en honkbal de advertenties geplaatst op kleine reclameborden net buiten de grens van het veld kunnen virtueel worden veranderd. In plaats van dezelfde advertentie aan iedereen te tonen, kunnen adverteerders kiezen welke advertenties getoond moeten worden op basis van de demografische gegevens van de persoon, de locatie, enz. In deze toepassingen worden de vier hoeken van het reclamebord gedetecteerd in de video, die dienen als de bestemmingspunten. De vier hoeken van de advertentie dienen als de bronpunten. Een homografie wordt berekend op basis van deze vier overeenkomstige punten en het wordt gebruikt om de advertentie te verdraaien in het videoframe.

Na het lezen van deze post heb je waarschijnlijk wel een idee over hoe je een plaatje op een virtueel billboard zet. Figuur 4. toont de eerste afbeelding die naar het internet is geüpload.

Figuur 4. Eerste afbeelding geüpload naar het internet.

En afbeelding 5. toont The Times Square.

Figuur 5. The Times Square
U kunt de code (C++ & Python) en afbeeldingen die in dit voorbeeld en andere voorbeelden in deze post zijn gebruikt, downloaden door u hier op onze nieuwsbrief te abonneren.

We kunnen een van de reclameborden op The Times Square vervangen door een afbeelding van onze keuze. Hier zijn de stappen.

  1. Schrijf een gebruikersinterface om de vier hoeken van het billboard in de afbeelding te verzamelen. Laten we deze punten pts_dst noemen
  2. Laat de grootte van de afbeelding die u op het virtuele billboard wilt zetten, w x h zijn. De hoeken van de afbeelding ( pts_src ) moeten dus (0,0), (w-1,0), (w-1,h-1) en (0,h-1) zijn
  3. Bereken de homografie met behulp van pts_src en pts_dst .
  4. Toepassing van de homografie op het bronbeeld en meng het met het doelbeeld om het beeld in figuur 6 te verkrijgen.

Merk op dat we in figuur 6 het beeld van figuur 4 hebben ingevoegd in het beeld van Times Square.

Figuur 6. Virtueel aanplakbord. Een van de reclameborden aan de linkerkant is vervangen door een afbeelding van onze keuze.

Subscribe & Download Code

Als dit artikel u beviel en u code (C++ en Python) en voorbeeldafbeeldingen die in deze post zijn gebruikt, wilt downloaden, kunt u zich abonneren op onze nieuwsbrief. U ontvangt dan ook een gratis Computer Vision Resource gids. In onze nieuwsbrief delen we OpenCV tutorials en voorbeelden geschreven in C++/Python, en Computer Vision en Machine Learning algoritmen en nieuws.

Subscribe Now

Image Credits

  1. De afbeelding in Figuur 4. was de eerste fotografische afbeelding die op het internet werd geupload. Het kwalificeert als fair use.
  2. De afbeelding gebruikt in Figuur 5. ( The Time Square ) is gelicenseerd onder de GFDL.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.