Wieża Babel, zgodnie z mityczną opowieścią w Biblii, była pierwszą katastrofą inżynieryjną człowieka. Projekt ten miał wszystkie wspaniałe cechy: jasną misję, dużo siły roboczej, brak ograniczeń czasowych i odpowiednią technologię (cegły i zaprawę murarską). A jednak poniósł spektakularną klęskę, ponieważ Bóg pomieszał język ludzkich robotników i nie mogli się już porozumieć.
Terminy takie jak „Homografia” często przypominają mi, jak wciąż zmagamy się z komunikacją. Homografia jest prostym pojęciem o dziwnej nazwie!
Co to jest homografia ?
Rozważmy dwa obrazy płaszczyzny (góra książki) pokazane na rysunku 1. Czerwona kropka reprezentuje ten sam punkt fizyczny na obu obrazach. W żargonie wizji komputerowej nazywamy to punktami odpowiadającymi. Rysunek 1. przedstawia cztery odpowiadające sobie punkty w czterech różnych kolorach – czerwonym, zielonym, żółtym i pomarańczowym. Homografia jest transformacją (macierzą 3×3), która mapuje punkty w jednym obrazie na odpowiadające im punkty w drugim obrazie.
Teraz, ponieważ homografia jest macierzą 3×3, możemy ją zapisać jako
Rozważmy pierwszy zestaw odpowiadających punktów – w pierwszym obrazie i w drugim obrazie. Następnie, homografia mapuje je w następujący sposób
Image Alignment Using Homography
Powyższe równanie jest prawdziwe dla WSZYSTKICH zestawów odpowiadających sobie punktów tak długo, jak długo leżą one na tej samej płaszczyźnie w świecie rzeczywistym. Innymi słowy możesz zastosować homografię do pierwszego obrazu i książka na pierwszym obrazie zostanie wyrównana z książką na drugim obrazie! Zobacz rysunek 2.
Ale co z punktami, które nie leżą na płaszczyźnie? Cóż, one NIE zostaną wyrównane przez homografię, jak widać na rysunku 2. Ale czekaj, co jeśli na obrazie są dwie płaszczyzny ? Cóż, wtedy masz dwie homografie – po jednej dla każdej płaszczyzny.
Panorama : Zastosowanie homografii
W poprzedniej części dowiedzieliśmy się, że jeśli znana jest homografia między dwoma obrazami, możemy wypaczać jeden obraz na drugi. Było jednak jedno duże zastrzeżenie. Obrazy musiały zawierać płaszczyznę (wierzch książki), a tylko część planarna była poprawnie wyrównana. Okazuje się, że jeśli zrobisz zdjęcie dowolnej sceny (nie tylko samolotu), a następnie zrobisz drugie zdjęcie obracając aparat, to oba obrazy są powiązane homografią! Innymi słowy, możesz zamontować aparat na statywie i zrobić zdjęcie. Następnie obrócić go wokół osi pionowej i zrobić kolejne zdjęcie. Dwa obrazy, które właśnie zrobiłeś dla całkowicie dowolnej sceny 3D są powiązane przez homografię. Te dwa obrazy będą miały pewne wspólne obszary, które mogą być wyrównane i zszyte i bingo masz panoramę z dwóch obrazów. Czy to naprawdę takie proste? Nie! (przepraszam, że rozczarowuję) O wiele więcej wchodzi w tworzenie dobrej panoramy, ale podstawową zasadą jest wyrównanie przy użyciu homografii i inteligentne zszycie tak, aby nie było widać szwów. Tworzenie panoram na pewno będzie częścią przyszłego postu.
Jak obliczyć homografię ?
Aby obliczyć homografię pomiędzy dwoma obrazami, musisz znać przynajmniej 4 punkty odpowiadające sobie pomiędzy tymi obrazami. Jeśli masz więcej niż 4 odpowiadające sobie punkty, jest jeszcze lepiej. OpenCV solidnie oszacuje homografię, która najlepiej pasuje do wszystkich odpowiadających sobie punktów. Zazwyczaj te punkty są znajdowane automatycznie przez dopasowanie cech takich jak SIFT lub SURF między obrazami, ale w tym poście będziemy po prostu klikać punkty ręcznie.
Spójrzmy najpierw na użycie.
C++
Python
Spójrzmy na bardziej kompletny przykład zarówno w C++ jak i Pythonie.
OpenCV C++ Homografia Przykład
Obrazy z rysunku 2. mogą być wygenerowane przy użyciu następującego kodu C++. Poniższy kod pokazuje, jak wziąć cztery odpowiadające sobie punkty w dwóch obrazach i wypaczać obraz na drugi.
OpenCV Python Homography Example
Obrazy z rysunku 2. mogą być również wygenerowane przy użyciu następującego kodu Pythona. Poniższy kod pokazuje, jak wziąć cztery odpowiadające sobie punkty w dwóch obrazach i wypaczać obraz na drugim.
Zastosowania homografii
Najciekawszym zastosowaniem homografii jest bez wątpienia tworzenie panoram (a.k.a image mosaicing i image stitching). Panoramy będą tematem późniejszego wpisu. Zobaczmy kilka innych ciekawych zastosowań.
Korekcja perspektywy przy użyciu Homografii
Powiedzmy, że masz zdjęcie pokazane na rysunku 1. Czy nie byłoby fajnie, gdybyś mógł kliknąć na cztery rogi książki i szybko uzyskać obraz, który wygląda jak ten pokazany na rysunku 3. Kod dla tego przykładu możesz pobrać w sekcji download poniżej. Oto kroki.
- Napisz interfejs użytkownika, aby zebrać cztery rogi książki. Nazwijmy te punkty pts_src
- Musimy znać współczynnik proporcji książki. W przypadku tej książki współczynnik proporcji ( szerokość / wysokość ) wynosi 3/4. Możemy więc wybrać rozmiar obrazu wyjściowego jako 300×400, a nasze punkty docelowe ( pts_dst ) jako (0,0), (299,0), (299,399) i (0,399)
- Uzyskaj homografię przy użyciu pts_src i pts_dst .
- Zastosuj homografię do obrazu źródłowego, aby uzyskać obraz na rysunku 3.
Wirtualny Billboard
W wielu telewizyjnych wydarzeń sportowych, reklama w praktycznie wstawione w żywej transmisji wideo. Np. w piłce nożnej i baseballu reklamy umieszczone na małych tablicach reklamowych tuż poza granicami pola mogą być wirtualnie zmienione. Zamiast wyświetlać tę samą reklamę do wszystkich, reklamodawcy mogą wybrać, które reklamy pokazać na podstawie demografii osoby, lokalizacja itp. W tych aplikacjach cztery rogi tablicy reklamowej są wykrywane w wideo, które służą jako punkty docelowe. Cztery rogi reklamy służą jako punkty źródłowe. Homografia jest obliczana na podstawie tych czterech odpowiednich punktów i jest używana do wypaczenia reklamy w ramce wideo.
Po przeczytaniu tego postu prawdopodobnie masz pomysł na to, jak umieścić obraz na wirtualnym billboardzie. Rysunek 4. przedstawia pierwszy obrazek wgrany do internetu.
A Rysunek 5. przedstawia The Times Square.
Możemy zastąpić jeden z billboardów na The Times Square wybranym przez nas obrazem. Oto kroki.
- Napisz interfejs użytkownika, aby zebrać cztery rogi billboardu na obrazie. Nazwijmy te punkty pts_dst
- Pozwól, aby rozmiar obrazu, który chcesz umieścić na wirtualnym billboardzie, wynosił w x h. Narożnikami obrazu ( pts_src ) mają być zatem (0,0), (w-1,0), (w-1,h-1) i (0,h-1)
- Otrzymaj homografię, używając pts_src i pts_dst .
- Zastosuj homografię do obrazu źródłowego i zmieszaj go z obrazem docelowym, aby uzyskać obraz na rysunku 6.
Zauważ na rysunku 6. wstawiliśmy obraz pokazany na rysunku 4. do obrazu The Times Square.
Subscribe & Download Code
Jeśli podobał Ci się ten artykuł i chciałbyś pobrać kod (C++ i Python) oraz przykładowe obrazy użyte w tym wpisie, zapisz się do naszego newslettera. Otrzymasz również darmowy przewodnik Computer Vision Resource. W naszym biuletynie udostępniamy tutoriale i przykłady OpenCV napisane w C++/Pythonie, a także algorytmy wizji komputerowej i uczenia maszynowego oraz nowości.
Zapisz się teraz
Image Credits
- Obraz na rysunku 4. był pierwszym obrazem fotograficznym umieszczonym w Internecie. To kwalifikuje się jako uczciwe użycie.
- Obraz użyty na rysunku 5. ( The Time Square ) jest objęty licencją GFDL.