Učte se OpenCV

Babylonská věž byla podle bájného biblického příběhu první technickou katastrofou člověka. Tento projekt měl všechny skvělé vlastnosti: jasný úkol, spoustu lidské síly, žádné časové omezení a odpovídající technologie ( cihly a malta ). Přesto velkolepě selhal, protože Bůh popletl jazyk lidských dělníků a ti se už nedokázali domluvit.

Termíny jako „homografie“ mi často připomínají, jak stále bojujeme s komunikací. Homografie je jednoduchý pojem s podivným názvem!“

Co je to homografie?“

Podívejme se na dva obrázky roviny (horní část knihy), které jsou znázorněny na obrázku 1. Na obrázku 1 jsou zobrazeny dvě roviny. Červená tečka představuje na obou obrázcích stejný fyzikální bod. V žargonu počítačového vidění tyto odpovídající body nazýváme. Na obrázku 1. jsou zobrazeny čtyři korespondující body ve čtyřech různých barvách – červené, zelené, žluté a oranžové. Homografie je transformace ( matice 3×3 ), která mapuje body na jednom obrázku na odpovídající body na druhém obrázku.

Obrázek 1 : Dva obrázky 3D roviny ( horní část knihy ) jsou spojeny homografií

Nyní, protože homografie je matice 3×3, můžeme ji zapsat jako

Uvažujme první sadu odpovídajících bodů – na prvním obrázku a na druhém obrázku. Homografie je pak mapuje následujícím způsobem

Zarovnání obrazů pomocí homografie

Výše uvedená rovnice platí pro VŠECHNY množiny odpovídajících si bodů, pokud leží ve stejné rovině reálného světa. Jinými slovy můžete aplikovat homografii na první obrázek a kniha na prvním obrázku se zarovná s knihou na druhém obrázku! Viz obrázek 2.

Obrázek 2 : Jeden obraz 3D roviny lze pomocí homografie zarovnat s druhým obrazem téže roviny

A co body, které neleží v rovině ? No, ty se pomocí homografie NEvyrovnají, jak můžete vidět na obrázku 2. Ale počkejte, co když jsou na obrázku dvě roviny ? No, pak máte dvě homografie – pro každou rovinu jednu.

Panorama : Aplikace homografie

V předchozí části jsme se dozvěděli, že pokud známe homografii mezi dvěma obrazy, můžeme jeden obraz deformovat na druhý. Mělo to však jednu velkou výhradu. Obrázky musely obsahovat rovinu ( vrchol knihy ) a správně zarovnaná byla pouze rovinná část. Ukázalo se, že pokud vyfotíte libovolnou scénu ( nejen rovinu ) a pak pořídíte druhý snímek otočením fotoaparátu, oba snímky spolu souvisí homograficky! Jinými slovy můžete fotoaparát připevnit na stativ a pořídit snímek. Poté jej otočte kolem svislé osy a pořiďte další snímek. Dva právě pořízené snímky zcela libovolné 3D scény spolu souvisejí pomocí homografie. Oba snímky budou mít některé společné oblasti, které lze zarovnat a sešít, a bingo, máte panorama dvou snímků. Je to opravdu tak snadné? Ne! (omlouvám se, že vás zklamu) Na vytvoření dobrého panoramatu je toho mnohem více, ale základním principem je zarovnání pomocí homografie a inteligentní sešití tak, aby nebyly vidět švy. Vytváření panoramat bude určitě součástí některého z příštích příspěvků.

Jak vypočítat homografii ?

Pro výpočet homografie mezi dvěma snímky potřebujete znát alespoň 4 bodové korespondence mezi oběma snímky. Pokud máte více než 4 odpovídající body, je to ještě lepší. OpenCV robustně odhadne homografii, která nejlépe odpovídá všem odpovídajícím bodům. Obvykle jsou tyto bodové korespondence nalezeny automaticky pomocí shodných rysů, jako je SIFT nebo SURF mezi obrázky, ale v tomto příspěvku budeme jednoduše klikat na body ručně.

Nejprve se podíváme na použití.

C++

Python

Podívejme se na kompletnější příklad v jazyce C++ i Python.

Příklad homografie OpenCV C++

Obrázky na obrázku 2. lze generovat pomocí následujícího kódu C++. Následující kód ukazuje, jak vzít čtyři odpovídající body ve dvou obrázcích a deformovat obrázek na druhý.

Příklad homografie OpenCV Python

Obrázky na obrázku 2. lze také vygenerovat pomocí následujícího kódu Pythonu. Níže uvedený kód ukazuje, jak vzít čtyři odpovídající body ve dvou obrázcích a deformovat obrázek na druhý.

Aplikace homografie

Nejzajímavější aplikací homografie je bezpochyby vytváření panoramat ( neboli mozaikování a sešívání obrázků ). Panoramata budou předmětem pozdějšího příspěvku. Podívejme se na další zajímavé aplikace.

Perspektivní korekce pomocí homografie

Obrázek 3. Perspektivní korekce

Předpokládejme, že máte fotografii zobrazenou na obrázku 1. Na obrázku 1 je zobrazen obrázek. Nebylo by skvělé, kdybyste mohli kliknout na čtyři rohy knihy a rychle získat obrázek, který by vypadal jako ten na obrázku 3? Kód pro tento příklad získáte v části ke stažení níže. Zde jsou kroky:

  1. Napište uživatelské rozhraní pro sběr čtyř rohů knihy. Nazvěme tyto body pts_src
  2. Potřebujeme znát poměr stran knihy. Pro tuto knihu je poměr stran ( šířka / výška ) 3/4. Můžeme tedy zvolit velikost výstupního obrázku 300×400 a naše cílové body ( pts_dst ) budou (0,0), (299,0), (299,399) a (0,399)
  3. Získejte homografii pomocí pts_src a pts_dst .
  4. Použijte homografii na zdrojový obrázek a získejte obrázek na obrázku 3.
Kód a obrázky použité v tomto příspěvku si můžete stáhnout, pokud se přihlásíte k odběru našeho zpravodaje zde.

Virtuální billboard

V mnoha televizních sportovních událostech se reklama virtuálně vkládá do živého videopřenosu. Např. ve fotbale a baseballu lze virtuálně měnit reklamy umístěné na malých reklamních tabulích přímo za hranicí hřiště. Místo toho, aby se všem zobrazovala stejná reklama, mohou inzerenti vybírat, které reklamy se zobrazí na základě demografických údajů dané osoby, její polohy atd. V těchto aplikacích jsou ve videu detekovány čtyři rohy reklamní tabule, které slouží jako cílové body. Čtyři rohy reklamy slouží jako zdrojové body. Na základě těchto čtyř odpovídajících bodů se vypočítá homografie, která se použije k deformaci reklamy do rámce videa.

Po přečtení tohoto příspěvku máte pravděpodobně představu o tom, jak umístit obrázek na virtuální billboard. Na obrázku 4. je zobrazen první obrázek nahraný na internet.

Obrázek 4. Na obrázku 4 je zobrazen první obrázek nahraný na internet. První obrázek nahraný na internet.

A na obrázku 5. je zobrazen The Times Square.

Obrázek 5. zobrazuje první obrázek nahraný na internet. The Times Square
Kód (C++ & Python) a obrázky použité v tomto příkladu a dalších příkladech v tomto příspěvku si můžete stáhnout, pokud se přihlásíte k odběru našeho newsletteru zde.

Můžeme nahradit jeden z billboardů na The Times Square obrázkem podle našeho výběru. Zde je postup:

  1. Napište uživatelské rozhraní pro sběr čtyř rohů billboardu na obrázku. Nazvěme tyto body pts_dst
  2. Nechť je velikost obrázku, který chcete umístit na virtuální billboard, w x h. Rohy obrázku ( pts_src ) tedy mají být (0,0), (w-1,0), (w-1,h-1) a (0,h-1)
  3. Zjistěte homografii pomocí pts_src a pts_dst .
  4. Použijeme homografii na zdrojový obrázek a smícháme ji s cílovým obrázkem, čímž získáme obrázek na obrázku 6.

Všimněte si, že na obrázku 6. jsme do obrázku The Times Square Image vložili obrázek zobrazený na obrázku 4.

Obrázek 6. Virtuální billboard. Jeden z billboardů na levé straně jsme nahradili obrázkem podle našeho výběru.

Předplatné &Stáhnout kód

Pokud se vám tento článek líbil a chcete si stáhnout kód (C++ a Python) a ukázkové obrázky použité v tomto příspěvku, přihlaste se k odběru našeho zpravodaje. Obdržíte také bezplatného průvodce zdroji pro počítačové vidění. V našem zpravodaji sdílíme výukové programy a příklady OpenCV napsané v jazyce C++/Python a algoritmy a novinky v oblasti počítačového vidění a strojového učení.

Předplaťte si odběr

Kredit obrázku

  1. Obrázek na obrázku 4. byl prvním fotografickým obrázkem nahraným na internet. Lze jej kvalifikovat jako spravedlivé použití.
  2. Obrázek použitý na obrázku 5. ( The Time Square ) je licencován pod licencí GFDL.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.