Jeffrey Cross
Jeffrey Cross

Kódová schránka: Ztratíte hlavu s OpenCV

OpenCV je „knihovna programovacích funkcí pro počítačové vidění v reálném čase.“ Open source projekt podporovaný společností Willow Garage, knihovna obsahuje více než 500 algoritmů pro manipulaci s obrázky, detekci objektů, extrakci prvků a řadu dalších nástrojů, které můžete použít k práci. psát programy, které mohou „vidět“.

Zpracování OPENCV a Java Library, projekt vedený Stéphane Cousotem a Douglasem Edricem Stanleyem v „Supleure d'Art d'Aix-en-Provence“, poskytuje obálku, která vám umožňuje používat podmnožinu OpenCV ve zpracování. Na počest Halloweenu vám tento kódový blok ukáže, jak pomocí OpenCV odebrat hlavy lidí v reálném čase z video zdroje. Například:

Budoucí příspěvky se budou týkat méně hrozných aplikací pro tuto úžasnou knihovnu.

Instalace OpenCV Processing a Java Library

Prvním krokem v používání knihovny je stažení a instalace z http://ubaa.net/shared/processing/opencv/. Dokumentace webu je skvělá - postupujte podle kroků uvedených v části „Pokyny k instalaci“ na hlavní stránce. Jakmile budete postupovat podle kroků, zapněte Zpracování a poté vyzkoušejte kód v příkladu detect (), který umístí červený obdélník kolem všech obličejů (čelní pohled) zjištěných ve webové kameře. Měli byste vidět něco takového:

Poznámka pro uživatele systému Windows: budete možná muset nainstalovat webovou kameru v aplikaci ProcessingQuicktime a WinVDIG.

Nastavení náčrtu

Až budete mít základní zjistit () můžete použít následující skicu.Stejně jako u jiných příspěvků v této sérii můžete buď zvýraznit celý text v poli níže a stisknout klávesy ctrl + c, nebo přejít přímo do úložiště kódů Makezine a kopírovat headless_cam.pde.

Když spustíte program, měli byste vidět zprávu „vystoupit ze scény a stisknout libovolnou klávesu“. Jakmile je pobřeží jasné, stiskněte libovolnou klávesu a vraťte se zpět do obrazu. Vy (a kdokoli jiný) byste měli díky OpenCV být bez hlavy. Když se pohybujete, všimnete si, že vaše hlava bude mrkat dovnitř a ven - to se děje, když něco narušuje detekční algoritmus OpenCV. Pokud například položíte ruku před obličej, bude to „přerušit“ detekční algoritmus OpenCV.

Diskuse

Jak to funguje? Je to docela jednoduché - vlastně všechny skici jsou hledání tváří pomocí OpenCV zjistit () a poté nahradí detekované tváře stejnými (ale o něco většími) pixely z obrázku na pozadí uloženého na začátku náčrtu. Tím je většinou obličej „mizet“. Mírné rozdíly v osvětlení vytvářejí malé změny mezi novými a starými obrazy, takže nahrazený obličej vypadá trochu boxy. Teoreticky byste měli být schopni některé z nich vyhladit jinými funkcemi OpenCV, ale to je pro budoucí projekty.

Prvním krokem ve skice je uložení obrázku prázdné scény na pozadí. To provádí kopírovat() příkaz v keyPressed () metoda:

bg.copy (vačka, 0,0, šířka, výška, 0,0, šířka, výška);

Příkaz vyžaduje dva obrazy: a destinace obraz, na kterém budou pixely zkopírovány naa a zdroj obraz, na kterém budou pixely zkopírovány z. Chcete-li ji použít, zavoláte kopírovat() metoda na cílovém obrazu (v tomto případě proměnná bg) a poskytnout devět (!) požadovaných argumentů, kterými jsou:

  • zdroj obrázek, ze kterého chceme vytvořit kopii. V tomto případě používáme proměnnou vačka, který obsahuje aktuální snímek z webové kamery.
  • Oblast ve zdrojovém obrázku, který má být zkopírován. Tato oblast je popsána v následujících čtyřech argumentech: souřadnice x a y levého horního rohu oblasti a šířka a výška oblasti.
  • Oblast v cílovém obrazu, kam budou kopírovat pixely. Ty jsou podobné předchozím čtyřem argumentům a sestávají ze souřadnic x a y spolu se šířkou a výškou oblasti. Pokud se rozměry liší mezi zdrojovými a cílovými oblastmi, bude zpracování automaticky zvětšeno.

Po dokončení tohoto příkazu budete mít v proměnné uloženou kopii pozadí bg. Dalším krokem je použití OpenCV pro vyhledávání tváří. Jak bylo popsáno výše, je to provedeno pomocí zjistit () metoda, která vrací pole Rectangles. Obdélník je třída, která je obsažena v jazyce Java, což je základní jazyk, ze kterého je zpracování odvozeno. (Jedna z nejlepších věcí na Zpracování je, že může použít jakýkoliv příkaz, který můžete použít v jazyce Java, což z něj dělá velmi silný jazyk.) Obdélník má čtyři klíčová pole, která se nás týkají: souřadnice x a y svrchu levý roh a šířku a výšku. (Zní povědomě?)

Pokud vše, co jsme chtěli udělat, je nahradit jen tvář, můžeme jednoduše použít kopírovat() příkaz k kopírování v ekvivalentních regionech. (Poznámka: loadPixels () a updatePixels () Tato metoda je vyžadována vždy, když chceme přistupovat nebo aktualizovat pixely v obrázku.) Zde je kód:

fg.copy (vačka, 0,0, šířka, výška, 0,0, šířka, výška); // Kopírování obrazu kamery do fg opencv.copy (cam); // Kopírování obrázku do bufferu openCV Rectangle [] faces = opencv.detect (); // detekovat cokoliv, co sestává z FRONTALFACe pro (int i = 0; i

Zde je výstup:

Jak vidíte, odstranění pouze obličeje není úplně správné, protože hodně hlavy zůstává viditelné. Potřebujeme také způsob, jak zvětšit velikost krabice. Tohle je práce zvětšitFaceBox (), který používá trochu trigonometrie zvětšit box daným procentem a překládat to podél jeho úhlopříčky. Následující schéma ukazuje, co se děje:

Trig přichází do hry při výpočtu správných posunů, které posunou obdélník nahoru o úhlopříčku. Klíčovou funkcí je atan2 (), který vypočítává úhel mezi dvěma body vzhledem k ose x. (Tento úhel se často nazývá theta otřesnými starými matematiky). Jakmile máš theta, můžete použít cos () a hřích() funkce pro výpočet posunutí x a y dx a dy. Zde je kód:

Zvětšit obdélníkFaceBox (float incPct, int x, int y, int w, int h) {float r = dist (0,0, w, h) / 2; // Vypočítá poloměr středové diagonální float theta = atan2 (h, w); // Vypočítá úhel diagonálního plováku dx = r * incPct * cos (theta); // Najde float dy = r * incPct * sin (theta); vrátit nový obdélník ((int) (x - dx), (int) (y - dy), (int) (w + 2 * dx), (int) (h + 2 * dy)); }

Konečně, protože rozšiřujeme krabici, musíme se ujistit, že zůstane ve viditelných oblastech obrazovky, stejně jako jsme to udělali v projektu Swat an (arraylist) cílů, který se zde provádí:

faceBox = enlargeFaceBox (0.75, plochy [i] .x, plochy [i] .y, plochy [i] .width, plochy [i] .výška); if (faceBox.x <0) {faceBox.x = 0; } if (faceBox.x + faceBox.width> width) {faceBox.width = width - faceBox.x; } if (faceBox.y <0) {faceBox.y = 0; } if (faceBox.y + faceBox.height> height) {faceBox.height = výška - faceBox.y; } ...

A to je vše. Doufám, že můžete najít strašidelné použití pro to na Halloween.

PS: Můžete se dozvědět více informací o tom, jak pracovat s obrázky z vynikajícího tutoriálu obrázků a pixelů Daniela Shiffmana na stránkách Processing.org. (Tato kapitola je výňatkem z jeho nádherné knihy, Zpracování učení: Průvodce začátečníkem k programovacím obrázkům, animaci a interakci, který vám doporučuji vyzvednout, pokud chcete opravdu zvládnout zpracování.)

V hale Maker:


Začínáme se zpracováním Naučte se programování počítače jednoduchým způsobem pomocí zpracování, což je jednoduchý jazyk, který umožňuje používat kód pro vytváření výkresů, animací a interaktivní grafiky. Kurzy programování obvykle začínají teorií, ale tato kniha vám umožňuje skočit přímo do kreativních a zábavných projektů. Je ideální pro každého, kdo se chce naučit základní programování a slouží jako jednoduchý úvod do grafiky pro lidi s některými programovacími dovednostmi.

Podíl

Zanechat Komentář