Lær OpenCV

Babelstårnet var ifølge en mytisk fortælling i Bibelen menneskets første tekniske katastrofe. Projektet havde alle de gode kvaliteter, nemlig at have en klar mission, masser af mandskab, ingen tidsbegrænsning og passende teknologi ( mursten og mørtel ). Alligevel mislykkedes det på spektakulær vis, fordi Gud forvirrede de menneskelige arbejderes sprog, og de kunne ikke længere kommunikere.

Termer som “homografi” minder mig ofte om, hvordan vi stadig kæmper med kommunikation. Homografi er et simpelt begreb med et mærkeligt navn!

Hvad er homografi?

Tænk på to billeder af et fly (øverst i bogen), der er vist i figur 1. Den røde prik repræsenterer det samme fysiske punkt i de to billeder. I jargon for computer vision kalder vi disse tilsvarende punkter. Figur 1. viser fire tilsvarende punkter i fire forskellige farver – rød, grøn, gul og orange. En homografi er en transformation ( en 3×3 matrix ), der kortlægger punkterne i det ene billede til de tilsvarende punkter i det andet billede.

Figur 1 : To billeder af et 3D-plan ( toppen af bogen ) er relateret ved hjælp af en homografi

Nu da en homografi er en 3×3 matrix kan vi skrive den som

Lad os betragte det første sæt af tilsvarende punkter – i det første billede og i det andet billede. Så kortlægger homografien dem på følgende måde

Billedtilpasning ved hjælp af homografi

Overstående ligning gælder for ALLE sæt af tilsvarende punkter, så længe de ligger på samme plan i den virkelige verden. Med andre ord kan du anvende homografien på det første billede, og bogen i det første billede vil blive justeret med bogen i det andet billede! Se figur 2.

Figur 2 : Et billede af et 3D-plan kan justeres med et andet billede af det samme plan ved hjælp af homografi

Men hvad med punkter, der ikke ligger på planen ? De vil IKKE blive justeret ved hjælp af en homografi, som du kan se i figur 2. Men vent, hvad nu hvis der er to planer i billedet ? Ja, så har du to homografier – en for hvert plan.

Panorama : en anvendelse af homografi

I det foregående afsnit lærte vi, at hvis en homografi mellem to billeder er kendt, kan vi forvrænge det ene billede på det andet. Der var dog et stort forbehold. Billederne skulle indeholde et plan ( toppen af en bog ), og kun den plane del blev justeret korrekt. Det viser sig, at hvis man tager et billede af en hvilken som helst scene ( ikke kun et plan ) og derefter tager et andet billede ved at dreje kameraet, er de to billeder relateret ved en homografi! Du kan med andre ord montere dit kamera på et stativ og tage et billede. Derefter kan du panorere det om den lodrette akse og tage endnu et billede. De to billeder, du lige har taget af en helt vilkårlig 3D-scene, er relateret ved hjælp af en homografi. De to billeder vil have nogle fælles områder, som kan justeres og stitches, og bingo, så har du et panorama af to billeder. Er det virkelig så let? Nej! (beklager at skuffe) Der skal meget mere til for at skabe et godt panorama, men det grundlæggende princip er at justere ved hjælp af en homografi og stitche intelligent, så man ikke kan se sømmene. Oprettelse af panoramaer vil helt sikkert være en del af et fremtidigt indlæg.

Hvordan beregner man en homografi?

For at beregne en homografi mellem to billeder skal du kende mindst 4 punktkorrespondancer mellem de to billeder. Hvis du har mere end 4 tilsvarende punkter, er det endnu bedre. OpenCV vil robust estimere en homografi, der passer bedst til alle tilsvarende punkter. Normalt findes disse punktkorrespondancer automatisk ved at matche funktioner som SIFT eller SURF mellem billederne, men i dette indlæg skal vi blot klikke på punkterne i hånden.

Lad os først se på brugen.

C++

Python

Lad os se på et mere komplet eksempel i både C++ og Python.

OpenCV C++ Homography Example

Billeder i figur 2. kan genereres ved hjælp af følgende C++-kode. Nedenstående kode viser, hvordan man tager fire tilsvarende punkter i to billeder og warper billedet over på det andet.

OpenCV Python Homography Example

Billederne i figur 2. kan også genereres ved hjælp af følgende Python-kode. Nedenstående kode viser, hvordan man tager fire tilsvarende punkter i to billeder og warper billedet over på det andet.

Anvendelser af homografi

Den mest interessante anvendelse af homografi er utvivlsomt at lave panoramaer ( a.k.a. image mosaicing og image stitching ). Panoramas vil være emnet for et senere indlæg. Lad os se nogle andre interessante anvendelser.

Perspektivkorrektion ved hjælp af homografi

Figur 3. Perspektivkorrektion

Lad os sige, at du har et foto, der er vist i figur 1. Ville det ikke være fedt, hvis du kunne klikke på de fire hjørner af bogen og hurtigt få et billede, der ligner det, der er vist i figur 3. Du kan få koden til dette eksempel i download-sektionen nedenfor. Her er trinene:

  1. Skriv en brugergrænseflade til at samle de fire hjørner af bogen. Lad os kalde disse punkter pts_src
  2. Vi har brug for at kende bogens højde/breddeforhold. For denne bog er formatforholdet ( bredde / højde ) 3/4. Så vi kan vælge udgangsbilledstørrelsen til at være 300×400, og vores destinationspunkter ( pts_dst ) til at være (0,0), (299,0), (299,399) og (0,399)
  3. Opnå homografien ved hjælp af pts_src og pts_dst .
  4. Anvend homografien på kildebilledet for at opnå billedet i figur 3.
Du kan downloade den kode og de billeder, der er anvendt i dette indlæg, ved at abonnere på vores nyhedsbrev her.

Virtuel billboard

I mange tv-transmitterede sportsbegivenheder, reklame i virtuelt indsat i live video feed. F.eks. i fodbold og baseball kan de reklamer, der er placeret på små reklametavler lige uden for feltets afgrænsning, ændres virtuelt. I stedet for at vise den samme annonce til alle kan annoncørerne vælge, hvilke annoncer der skal vises på baggrund af personens demografiske data, placering osv. I disse applikationer registreres de fire hjørner af reklametavlen i videoen, som fungerer som destinationspunkter. Annoncens fire hjørner tjener som kildepunkter. Der beregnes en homografi på grundlag af disse fire tilsvarende punkter, og den bruges til at skævvride annoncen ind i videobilledet.

Efter at have læst dette indlæg har du sikkert fået en idé om, hvordan du kan sætte et billede på en virtuel reklametavle. Figur 4. viser det første billede, der er uploadet til internettet.

Figur 4. Første billede uploadet til internettet.

Og figur 5. viser The Times Square.

Figur 5. The Times Square
Du kan downloade den kode (C++ & Python) og de billeder, der er brugt i dette eksempel og andre eksempler i dette indlæg, ved at abonnere på vores nyhedsbrev her.

Vi kan erstatte et af plakaterne på The Times Square med et billede efter eget valg. Her er trinene.

  1. Skriv en brugergrænseflade for at samle de fire hjørner af billboardet i billedet. Lad os kalde disse punkter pts_dst
  2. Lad størrelsen af det billede, du ønsker at placere på den virtuelle plakattavle, være w x h. Billedets hjørner ( pts_src ) skal derfor være (0,0), (w-1,0), (w-1,h-1) og (0,h-1)
  3. Opnå homografien ved hjælp af pts_src og pts_dst .
  4. Anvend homografien på kildebilledet og bland det med destinationsbilledet for at opnå billedet i figur 6.

Bemærk, at vi i figur 6. har indsat billedet vist i figur 4. i The Times Square-billedet.

Figur 6. Virtuel reklametavle. En af billboards i venstre side er blevet erstattet med et billede efter eget valg.

Abonner &Download kode

Hvis du kunne lide denne artikel og gerne vil downloade kode (C++ og Python) og eksempelbilleder, der er brugt i dette indlæg, kan du abonnere på vores nyhedsbrev. Du vil også modtage en gratis Computer Vision Resource guide. I vores nyhedsbrev deler vi OpenCV-tutorials og eksempler skrevet i C++/Python samt algoritmer og nyheder om Computer Vision og Machine Learning.

Abonner nu

Billedkreditering

  1. Billedet i figur 4. var det første fotografiske billede, der blev uploadet til internettet. Det kan betegnes som fair use.
  2. Det billede, der anvendes i figur 5. ( The Time Square ) er licenseret under GFDL.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.