Learn OpenCV

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.

Rysunek 1: Dwa obrazy płaszczyzny 3D (góra książki) są powiązane przez homografię

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.

Rysunek 2 : Jeden obraz płaszczyzny 3D może być wyrównany z innym obrazem tej samej płaszczyzny przy użyciu homografii

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

Rysunek 3. Perspective Correction

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.

  1. Napisz interfejs użytkownika, aby zebrać cztery rogi książki. Nazwijmy te punkty pts_src
  2. 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)
  3. Uzyskaj homografię przy użyciu pts_src i pts_dst .
  4. Zastosuj homografię do obrazu źródłowego, aby uzyskać obraz na rysunku 3.
Możesz pobrać kod i obrazy użyte w tym poście, zapisując się do naszego newslettera tutaj.

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.

Rysunek 4. Pierwszy obrazek wgrany do internetu.

A Rysunek 5. przedstawia The Times Square.

Rysunek 5. The Times Square
Kod (C++ & Python) i obrazy użyte w tym przykładzie i innych przykładach w tym poście możesz pobrać zapisując się na nasz newsletter tutaj.

Możemy zastąpić jeden z billboardów na The Times Square wybranym przez nas obrazem. Oto kroki.

  1. Napisz interfejs użytkownika, aby zebrać cztery rogi billboardu na obrazie. Nazwijmy te punkty pts_dst
  2. 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)
  3. Otrzymaj homografię, używając pts_src i pts_dst .
  4. 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.

Rysunek 6. Wirtualny billboard. Jeden z billboardów po lewej stronie został zastąpiony wybranym przez nas obrazem.

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

  1. Obraz na rysunku 4. był pierwszym obrazem fotograficznym umieszczonym w Internecie. To kwalifikuje się jako uczciwe użycie.
  2. Obraz użyty na rysunku 5. ( The Time Square ) jest objęty licencją GFDL.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.