Lär dig OpenCV

Babels torn var enligt en mytisk berättelse i Bibeln människans första tekniska katastrof. Projektet hade alla de fantastiska egenskaperna att ha ett tydligt uppdrag, mycket arbetskraft, ingen tidsbegränsning och adekvat teknik ( tegel och murbruk ). Ändå misslyckades det spektakulärt eftersom Gud förvirrade de mänskliga arbetarnas språk och de kunde inte längre kommunicera.

Termer som ”homografi” påminner mig ofta om hur vi fortfarande kämpar med kommunikation. Homografi är ett enkelt begrepp med ett konstigt namn!

Vad är homografi?

Tänk på två bilder av ett plan (överst i boken) som visas i figur 1. Den röda pricken representerar samma fysiska punkt i de två bilderna. På datorseendejargong kallar vi dessa motsvarande punkter för. Figur 1. visar fyra motsvarande punkter i fyra olika färger – röd, grön, gul och orange. En homografi är en transformation ( en 3×3-matris ) som kartlägger punkterna i den ena bilden till motsvarande punkter i den andra bilden.

Figur 1 : Två bilder av ett 3D-plan ( bokens ovansida ) är relaterade med hjälp av en homografi

Nu, eftersom en homografi är en 3×3-matris, kan vi skriva den som

Låt oss betrakta den första uppsättningen av korresponderande punkter – i den första bilden och i den andra bilden. Då kartlägger homografin dem på följande sätt

Image Alignment Using Homography

Ovanstående ekvation gäller för ALLA uppsättningar av motsvarande punkter så länge de ligger på samma plan i den verkliga världen. Med andra ord kan du tillämpa homografin på den första bilden och boken i den första bilden kommer att anpassas till boken i den andra bilden! Se figur 2.

Figur 2 : En bild av ett 3D-plan kan anpassas till en annan bild av samma plan med hjälp av homografi

Men hur är det med punkter som inte ligger på planet? Ja, de kommer INTE att anpassas med hjälp av en homografi, som du kan se i figur 2. Men vänta, vad händer om det finns två plan i bilden? Då har du två homografier – en för varje plan.

Panorama : en tillämpning av homografi

I det föregående avsnittet lärde vi oss att om en homografi mellan två bilder är känd kan vi förvränga den ena bilden på den andra. Det fanns dock ett stort förbehåll. Bilderna var tvungna att innehålla ett plan ( toppen av en bok ), och endast den plana delen var korrekt justerad. Det visar sig att om man tar en bild av vilken scen som helst ( inte bara ett plan ) och sedan tar en andra bild genom att rotera kameran, är de två bilderna relaterade genom en homografi! Med andra ord kan du montera kameran på ett stativ och ta en bild. Därefter kan du panorera den runt den vertikala axeln och ta en ny bild. De två bilder du just tog av en helt godtycklig 3D-scen är relaterade genom en homografi. De två bilderna kommer att ha vissa gemensamma områden som kan anpassas och sammanfogas och bingo du har ett panorama av två bilder. Är det verkligen så enkelt? Nej! (Ledsen att göra dig besviken) Det krävs mycket mer för att skapa ett bra panorama, men grundprincipen är att anpassa bilderna med hjälp av en homografi och att sy ihop dem på ett intelligent sätt så att du inte kan se sömmarna. Att skapa panoramor kommer definitivt att ingå i ett framtida inlägg.

Hur man beräknar en homografi?

För att beräkna en homografi mellan två bilder måste du känna till minst 4 punktkorrespondenser mellan de två bilderna. Om du har fler än 4 motsvarande punkter är det ännu bättre. OpenCV kommer robust att uppskatta en homografi som bäst passar alla motsvarande punkter. Vanligtvis hittas dessa punktkorrespondenser automatiskt genom att matcha funktioner som SIFT eller SURF mellan bilderna, men i det här inlägget kommer vi helt enkelt att klicka på punkterna för hand.

Låt oss titta på användningen först.

C++

Python

Låt oss titta på ett mer komplett exempel i både C++ och Python.

OpenCV C++ Homography Example

Bilderna i figur 2. kan genereras med hjälp av följande C++-kod. Koden nedan visar hur man tar fyra motsvarande punkter i två bilder och varpar bilden på den andra.

OpenCV Python Homography Example

Bilderna i figur 2 kan också genereras med hjälp av följande Python-kod. Koden nedan visar hur man tar fyra motsvarande punkter i två bilder och varpar bilden på den andra.

Användningar av homografi

Den mest intressanta tillämpningen av homografi är utan tvekan att göra panoramabilder ( a.k.a. image mosaicing och image stitching ). Panoramor kommer att behandlas i ett senare inlägg. Låt oss se några andra intressanta tillämpningar.

Perspektivkorrigering med hjälp av homografi

Figur 3. Perspektivkorrigering

Vad sägs om att du har ett foto som visas i figur 1. Skulle det inte vara häftigt om du kunde klicka på bokens fyra hörn och snabbt få en bild som ser ut som den som visas i figur 3. Du kan få koden för det här exemplet i nedladdningsavsnittet nedan. Här är stegen:

  1. Skriv ett användargränssnitt för att samla in bokens fyra hörn. Låt oss kalla dessa punkter för pts_src
  2. Vi behöver veta bokens sidförhållande. För den här boken är bildförhållandet ( bredd/höjd ) 3/4. Så vi kan välja utdatabildens storlek till 300×400 och våra målpunkter ( pts_dst ) till (0,0), (299,0), (299,399) och (0,399)
  3. Hämta homografin med hjälp av pts_src och pts_dst .
  4. Använd homografin på källavbildningen för att få bilden i figur 3.
Du kan ladda ner koden och bilderna som används i det här inlägget genom att prenumerera på vårt nyhetsbrev här.

Virtuell reklamskylt

I många tv-sända sportevenemang läggs reklam virtuellt in i direktsänd videofeed. I fotboll och baseboll till exempel kan annonser som placeras på små reklamtavlor precis utanför spelplanen virtuellt ändras. I stället för att visa samma annons för alla kan annonsörerna välja vilka annonser som ska visas på grundval av personens demografiska uppgifter, plats osv. I dessa tillämpningar upptäcks reklamtavlans fyra hörn i videon som fungerar som målpunkter. Annonsens fyra hörn fungerar som källpunkter. En homografi beräknas utifrån dessa fyra korresponderande punkter och används för att förvränga annonsen i videoramen.

Efter att ha läst det här inlägget har du förmodligen fått en idé om hur man sätter en bild på en virtuell reklamtavla. Figur 4. visar den första bilden som laddas upp på Internet.

Figur 4. Första bilden som laddas upp till internet.

Och figur 5. visar Times Square.

Figur 5. The Times Square
Du kan ladda ner koden (C++ & Python) och bilderna som används i det här exemplet och andra exempel i det här inlägget genom att prenumerera på vårt nyhetsbrev här.

Vi kan byta ut en av reklamskyltarna på The Times Square mot en valfri bild. Här är stegen.

  1. Skriv ett användargränssnitt för att samla in de fyra hörnen av reklamtavlan i bilden. Låt oss kalla dessa punkter för pts_dst
  2. Låt storleken på den bild som du vill placera på den virtuella affischtavlan vara w x h. Hörnen i bilden ( pts_src ) ska därför vara (0,0), (w-1,0), (w-1,h-1) och (0,h-1)
  3. Få fram homografin med hjälp av pts_src och pts_dst .
  4. Använd homografin på källbilden och blanda den med målbilden för att få bilden i figur 6.

Märk att vi i figur 6 har infogat bilden som visas i figur 4 i bilden av Times Square.

Figur 6. Virtuell reklamskylt. En av reklamtavlorna på vänster sida har ersatts med en valfri bild.

Prenumerera & Ladda ner kod

Om du gillade den här artikeln och vill ladda ner kod (C++ och Python) och exempelbilder som användes i det här inlägget kan du prenumerera på vårt nyhetsbrev. Du kommer också att få en gratis resursguide för datorseende. I vårt nyhetsbrev delar vi med oss av OpenCV-handledning och exempel skrivna i C++/Python samt algoritmer och nyheter inom datorseende och maskininlärning.

Prenumerera nu

Bildkrediter

  1. Bilden i figur 4. var den första fotografiska bilden som laddades upp på internet. Den uppfyller kraven för rättvis användning.
  2. Den bild som används i figur 5. ( The Time Square ) är licensierad under GFDL.

Lämna ett svar

Din e-postadress kommer inte publiceras.