Turnul Babel, conform unei povestiri mitice din Biblie, a fost primul dezastru ingineresc al oamenilor. Proiectul a avut toate marile calități de a avea o misiune clară, multă forță de muncă, nicio constrângere de timp și o tehnologie adecvată ( cărămizi și mortar ). Cu toate acestea, a eșuat în mod spectaculos pentru că Dumnezeu a încurcat limba muncitorilor umani și aceștia nu au mai putut comunica.
Termeni precum „omografie” îmi amintesc adesea cum încă ne luptăm cu comunicarea. Omografia este un concept simplu cu un nume ciudat!
Ce este omografia?
Considerați două imagini ale unui plan (partea de sus a cărții) prezentate în figura 1. Punctul roșu reprezintă același punct fizic în cele două imagini. În jargonul viziunii computerizate numim aceste puncte corespunzătoare. Figura 1. prezintă patru puncte corespunzătoare în patru culori diferite – roșu, verde, galben și portocaliu. O omografie este o transformare ( o matrice 3×3 ) care pune în corespondență punctele dintr-o imagine cu punctele corespunzătoare din cealaltă imagine.
Acum, deoarece o omografie este o matrice 3×3, o putem scrie ca
Să luăm în considerare primul set de puncte corespunzătoare – în prima imagine și în a doua imagine. Apoi, omografia le cartografiază în felul următor
Image Alignment Using Homography
Ecuația de mai sus este valabilă pentru TOATE seturile de puncte corespondente, atâta timp cât acestea se află pe același plan în lumea reală. Cu alte cuvinte, puteți aplica omografia la prima imagine și cartea din prima imagine se va alinia cu cartea din a doua imagine! Vezi figura 2.
Dar cum rămâne cu punctele care nu se află pe plan ? Ei bine, acestea NU vor fi aliniate printr-o omografie, după cum puteți vedea în figura 2. Dar stați puțin, ce se întâmplă dacă există două planuri în imagine ? Ei bine, atunci aveți două omografii – una pentru fiecare plan.
Panorama : O aplicație a omografiei
În secțiunea anterioară, am învățat că, dacă se cunoaște o omografie între două imagini, putem deforma o imagine pe cealaltă. Cu toate acestea, a existat un mare avertisment. Imaginile trebuiau să conțină un plan ( partea de sus a unei cărți ) și numai partea plană era aliniată corect. S-a dovedit că, dacă faceți o fotografie a oricărei scene ( nu doar a unui plan ) și apoi faceți o a doua fotografie prin rotirea aparatului foto, cele două imagini sunt legate printr-o omografie! Cu alte cuvinte, puteți monta aparatul foto pe un trepied și să faceți o fotografie. Apoi, rotiți-l în jurul axei verticale și faceți o altă fotografie. Cele două imagini pe care tocmai le-ați luat dintr-o scenă 3D complet arbitrară sunt legate printr-o omografie. Cele două imagini vor avea unele regiuni comune care pot fi aliniate și îmbinate și bingo, veți obține o panoramă din două imagini. Este chiar atât de simplu? Nu! (îmi pare rău să vă dezamăgesc) Pentru a crea o panoramă bună este nevoie de mult mai mult decât atât, dar principiul de bază este alinierea cu ajutorul unei omografii și coaserea inteligentă, astfel încât să nu se vadă cusăturile. Crearea de panorame va face cu siguranță parte dintr-o postare viitoare.
Cum se calculează o omografie?
Pentru a calcula o omografie între două imagini, trebuie să cunoașteți cel puțin 4 puncte de corespondență între cele două imagini. Dacă aveți mai mult de 4 puncte corespondente, este și mai bine. OpenCV va estima în mod robust o omografie care se potrivește cel mai bine tuturor punctelor corespunzătoare. De obicei, aceste corespondențe de puncte sunt găsite automat prin potrivirea unor caracteristici cum ar fi SIFT sau SURF între imagini, dar în această postare vom face pur și simplu clic pe puncte cu mâna.
Să ne uităm mai întâi la utilizare.
C++
Python
Să ne uităm la un exemplu mai complet atât în C++ cât și în Python.
Exemplu de omografie OpenCV C++
Imaginile din figura 2. pot fi generate folosind următorul cod C++. Codul de mai jos arată cum se iau patru puncte corespondente din două imagini și cum se urzește imaginea pe cealaltă.
OpenCV Python Homography Example
Imaginile din figura 2. pot fi, de asemenea, generate folosind următorul cod Python. Codul de mai jos arată cum se iau patru puncte corespondente din două imagini și se urzește imaginea pe cealaltă.
Aplicații ale omografiei
Cea mai interesantă aplicație a omografiei este, fără îndoială, realizarea de panorame ( a.k.a. mozaicarea și îmbinarea imaginilor ). Panoramele vor fi subiectul unei postări ulterioare. Să vedem alte câteva aplicații interesante.
Corecția de perspectivă cu ajutorul Homografiei
Să presupunem că aveți o fotografie prezentată în figura 1. Nu ar fi grozav dacă ați putea să faceți clic pe cele patru colțuri ale cărții și să obțineți rapid o imagine care să arate ca cea din figura 3. Puteți obține codul pentru acest exemplu în secțiunea de descărcare de mai jos. Iată care sunt pașii.
- Scrieți o interfață utilizator pentru a colecta cele patru colțuri ale cărții. Să numim aceste puncte pts_src
- Am nevoie să cunoaștem raportul de aspect al cărții. Pentru această carte, raportul de aspect ( lățime / înălțime ) este 3/4. Deci putem alege dimensiunea imaginii de ieșire să fie 300×400, iar punctele noastre de destinație ( pts_dst ) să fie (0,0), (299,0), (299,399) și (0,399)
- Obțineți omografia folosind pts_src și pts_dst .
- Aplicați omografia la imaginea sursă pentru a obține imaginea din figura 3.
Virtual Billboard
În multe evenimente sportive televizate, publicitatea este inserată virtual în transmisiunile video în direct. De exemplu, în fotbal și baseball, reclamele plasate pe mici panouri publicitare chiar în afara limitei terenului pot fi modificate virtual. În loc să afișeze aceeași reclamă pentru toată lumea, agenții de publicitate pot alege ce reclame să afișeze în funcție de datele demografice ale persoanei, de locația acesteia etc. În aceste aplicații, cele patru colțuri ale panoului publicitar sunt detectate în videoclip, care servesc drept puncte de destinație. Cele patru colțuri ale anunțului servesc drept puncte sursă. O omografie este calculată pe baza acestor patru puncte corespunzătoare și este utilizată pentru a deforma reclama în cadrul video.
După ce ați citit această postare, probabil că v-ați făcut o idee despre cum să plasați o imagine pe un panou publicitar virtual. Figura 4. prezintă prima imagine încărcată pe internet.
Și figura 5. arată The Times Square.
Puteți înlocui unul dintre panourile publicitare din The Times Square cu o imagine la alegere. Iată care sunt pașii.
- Scrieți o interfață utilizator pentru a colecta cele patru colțuri ale panoului publicitar din imagine. Să numim aceste puncte pts_dst
- Să lăsăm dimensiunea imaginii pe care dorim să o punem pe panoul publicitar virtual să fie w x h. Colțurile imaginii ( pts_src ) vor fi deci (0,0), (w-1,0), (w-1,h-1) și (0,h-1)
- Obțineți omografia folosind pts_src și pts_dst .
- Aplicați omografia la imaginea sursă și amestecați-o cu imaginea de destinație pentru a obține imaginea din figura 6.
Observați că în figura 6. am inserat imaginea prezentată în figura 4. în imaginea Times Square.
Subscribe & Download Code
Dacă v-a plăcut acest articol și doriți să descărcați codul (C++ și Python) și imaginile de exemplu folosite în această postare, vă rugăm să vă abonați la newsletter-ul nostru. Veți primi, de asemenea, un ghid gratuit Computer Vision Resource Guide. În buletinul nostru informativ împărtășim tutoriale și exemple OpenCV scrise în C++/Python, precum și algoritmi și noutăți din domeniul Computer Vision și Machine Learning.
Subscribe Now
Image Credits
- Imaginea din figura 4. a fost prima imagine fotografică încărcată pe internet. Ea se califică drept utilizare corectă.
- Imaginea folosită în Figura 5. ( The Time Square ) este licențiată sub licența GFDL.