Jeffrey Cross
Jeffrey Cross

Zhotovení laserem řezaného Zoetrope se zpracováním a Kinect

Tento kódový blok vám ukáže, jak vytvořit fyzický zoetrope pomocí Processing, Kinect a laserového řezáku. Skica se načte ve filmu zaznamenaném z hloubkové kamery Kinect, pomocí knihovny Processing OpenCV se tento film promění v sérii obrysů a obrysy se uloží ve vektorovém formátu jako soubor DXF, který lze odeslat do laserového řezáku. Také vysvětlím návrh mechanismu diváka, který dává zoetrope jeho rotaci.

O Zoetropes

Než skočíte do kódu, trochu kulturní historie a inspirace. Zoetrope byla populární viktoriánská optická hračka, která produkovala formu animace ven z papírového kruhu. Tvůrci zoetrope by v kruhu vytiskli sérii snímků z animace. Pak by kruh byl obklopen neprůhledným diskem s řadou štěrbin z něj vyříznutých. Když se kruh papíru otočil, divák se na něj podíval skrz štěrbiny a viděl animaci. Štěrbiny se chovaly jako filmový projektor, což divákovi umožňovalo vidět pouze jeden snímek najednou v rychlém sledu, což vedlo k iluzi pohybu.

Lidé v poslední době začínají přijít na to, jak dosáhnout stejné iluze s trojrozměrnými objekty. Umělec Gregory Barsamian staví sochy, které se točí kolem před bleskovými světly, aby vytvořily iluzi pohybu. Sochy se skládají z řady různých objektů v různých fázích pohybu a blesky se chovají jako štěrbiny v zoetrope, aby vytvořily iluzi pohybu (Barsamian může být známým, aby někteří udělali fanoušky z našeho dřívějšího pokrytí: Gregory Barsamianova vytrvalost vize) .

Pixar nedávno zvedl trik k vytvoření fyzického zoetrope pro svou lobby. Animátoři byli přesvědčeni, že fyzický zoetrope je jedinečnou ukázkou principu animace: přeměny řady statických obrazů na pohyblivé:

Jaký je recept na fyzický zoetrope? Potřebujeme řadu obrazů, které představují po sobě jdoucí fáze pohybu. Pak je musíme transformovat na odlišné fyzické objekty. Jakmile je budeme mít, potřebujeme mechanismus, který je může otočit. A v neposlední řadě potřebujeme bleskové světlo, které „zmrazí“ každý objekt do jednoho snímku animace.

Jak to můžeme udělat sami? Abych získal tuto sbírku objektů, vyjmeme siluety z videa vytvořeného z Kinectu. Pak budeme obracet tyto siluety do vektorového souboru, který můžeme použít k řízení laserového řezáku, který vyřízne řadu akrylových objektů ve tvaru každého snímku naší animace.

Pojďme se ponořit.

Nahrávání hloubkového filmu

První věc, kterou musíte udělat, je stáhnout knihovnu Kinect pro zpracování a přidat ji do složky Processing libraries. Pokud nejste obeznámeni s tím, jak to udělat, Dan má na stránce knihovny Kinect jasné pokyny.

Tuto knihovnu využijeme k nahrání filmu s hloubkou mimo Kinect. (Teoreticky byste mohli být schopni použít také běžnou kameru a dobře osvětlenou místnost, ale jaká by to byla zábava?) Naštěstí je nahrávání vlastního filmu s hloubkou pouze pár řádků kódu mimo příklad Kinect, který se dodává s Knihovnou zpracování:

Diskuse

Promluvme si, jak to funguje. Nejprve zahrneme knihovnu Kinect a Knihovnu zpracování videa; Budeme to potřebovat později, abychom mohli natočit film. Poté deklarujeme objekty Kinect a MovieMaker. MovieMaker je objekt, který bude pracovat na nahrávání výstupu naší skici do filmového souboru.

V nastavení jsme nastavili snímkovou frekvenci na 24 tak, aby odpovídala filmu, který zaznamenáváme. Skicu nastavíme také na hodnotu 640 x 480, aby odpovídala velikosti obrazu videa, který bude přicházet ze systému Kinect. Provádíme základní nastavení Kinect: řekněte našemu objektu kinect, aby začal číst data ze zařízení a povolil hloubkový obraz. Poté inicializujeme třídu MovieMaker, což jí dává nastavení kvality, typ souboru a název souboru. Více o tom, jak MovieMaker pracuje v dokumentaci Zpracování, si můžete přečíst. Je důležité, aby obnovovací kmitočet, který přejdeme do programu MovieMaker, odpovídal rychlosti skici, aby se náš film přehrával správnou rychlostí.

Naše funkce kreslení je neuvěřitelně jednoduchá. Jediné, co děláme, je volání kinect.getDepthImage () a nakreslení výstupu do náčrtu pomocí funkce Processing image (). To nám ukáže obrázek ve stupních šedi představující mapu hloubky, kterou Kinect extrahuje ze scény. Jedná se o černobílý obraz, kde barva šedi každého pixelu neodpovídá barvě světla objektu, ale tomu, jak daleko to bylo od Kinectu. Bližší objekty budou mít světlejší pixely a vzdálenější objekty budou tmavší. Později budeme moci tyto pixely zpracovat, abychom vybrali objekty v určité hloubce pro naši siluetu.

Nyní, když jsme na obrazovce nakreslili obrázek hloubky, vše, co musíme udělat, je zachytit výsledek do nového rámce filmu, který nahráváme (mm.addFrame ()). Posledním významným detailem náčrtu je, že používáme klíčové události, abychom se mohli zastavit a dokončit film. Když někdo zasáhne mezerník, film přestane nahrávat a soubor uloží. Také musíme pamatovat na to, že na výstupu máme nějaké čištění Kinect, jinak dostaneme nějaké funky chyby, kdykoliv zastavíme náčrt.

Zde je příklad toho, jak vypadá film zaznamenaný s tímto náčrtem:

Pokud nemáte Kinect, nebo máte potíže s nahráváním filmů do hloubky, nezoufejte! Stále můžete hrát s dalším krokem. Můžete si stáhnout, že hloubka film mě dělá skákání jacky přímo z Vimeo: Kinect Test Movie pro Laser Zoetrope. Nahrál jsem také film o hloubce, který jsem použil pro závěrečný laserový zoetrope uvedený výše, pokud chcete sledovat přesně: Kinect Depth Test Movie. Později film uvádí Zacha Liebermana, umělce a hackera v New Yorku a jednoho ze spoluzakladatelů OpenFrameworks, bratrance zpracování C ++.

Vytvoření souboru Laser-Cutter

Nyní, když máme film o hloubce, musíme napsat další skicu Processing, která tento film zpracovává, vybírá rámce pro naši animaci, najde obrysy naší postavy a uloží vektorový soubor, který můžeme poslat do laserového řezáku.

Abychom toho dosáhli, použijeme knihovnu Processing OpenCV a vestavěnou funkci beginRaw () Processing. Vytvořte novou skicu Processing, uložte ji, vytvořte složku „data“ ve složce skici, přesuňte do ní hloubkový film (s názvem „test_movie.mov“) a vložte do zdrojového kódu následující zdrojový kód (nebo jej stáhněte z webu). soubor lasercut_zoetrope_generator.pde):

Diskuse

Pokud tento náčrt spustíte s druhým testovacím filmem, který jsem propojil výše, vytvoří se následující výstup:

… A také uloží soubor nazvaný “full_output.dxf” ve složce skici. Jedná se o vektorový soubor, který můžeme přivést do Illustratoru nebo jakéhokoliv jiného programu pro konečné zpracování, který posílá do laserového řezáku.

Podívejme se nyní na kód.

V setupu nahrajeme soubor test_movie.mov do OpenCV, což by mělo být známo z minulých příspěvků na OpenCV. Také nazýváme beginRaw (), což je funkce pro zpracování vektorových souborů. beginRaw () způsobí, že naše skica zaznamená všechny své výstupy do nového vektorového souboru, dokud neozveme endRaw (), takže můžeme vytvořit náš soubor přes více iterací smyčky kreslení. V tomto případě vytváříme soubor DXF, nikoli soubor PDF, protože tento formát je pro laser, který potřebuje spojité čáry, aby se dosáhlo spolehlivého výstupu, snáze zpracovatelný. PDF vytvořené Processing mají tendenci mít mnoho diskrétních úseků, které mohou způsobit funky výsledky při řezu laserem, včetně pomalejších úloh a nerovnoměrné tloušťky.

Teď, než se ponoříme do metody kreslení, trochu o přístupu. Chceme vytáhnout 12 různých snímků z našeho filmu, což by vytvořilo dobré rámce pro naši animaci. Pak chceme, aby OpenCV extrahoval své obrysy (nebo „konturu“ v jazyce OpenCV) a nakonec chceme kreslit ty v mřížce přes obrazovku, aby se nepřekrývaly a konečný soubor DXF bude obsahovat všechny rámce animace.

Tato skica přibližuje tyto problémy vytvořením proměnné „currentFrame“, která je definována mimo smyčku kreslení. Pak, na každém běhu smyčky kreslení, tato proměnná se zvýší a my používáme to dělat všechno, co potřebujeme: skákat dopředu ve filmu, pohybovat se do jiné oblasti skici kreslit, etc. Konečně, jakmile my máme dokončili kreslení všech 12 snímků na obrazovku, zavoláme „endRaw ()“ pro dokončení souboru DXF, stejně jako jsme v prvním náčrtu nazvali „mm.finish ()“ pro uzavření filmového souboru.

Takže, vzhledem k této celkové struktuře, jak nakreslíme konturu pro každý snímek? Podívejme se na kód:

opencv.jump (0,3 + mapa (currentFrame * timeBetweenFrames, 0, 9, 0, 1)); opencv.read ();

To řekne OpenCV, aby ve filmu přeskočil o určitou dobu. 0.3 je výchozím bodem rámců, které se chystáme chytit, a je to něco, co jsem zjistil při odhadu. Vyzkoušel jsem spoustu různých hodnot, pokaždé jsem skicu provozoval a viděl, s jakým rámcem jsem skončil, a posuzuji, zda udělají dobrou animaci. „0.3“ představuje počáteční čas v sekundách.

Chceme, aby všechny naše snímky byly rovnoměrně rozmístěny, takže naše animace hraje čistě. Abychom toho dosáhli, přidáváme stále větší částku na náš skok ve výši 0,3, na základě kterého jsme na tom. Jakmile vypočítáme správný čas, přečteme rámec filmu pomocí „opencv.read ()“

Dalších několik řádků používá operátor modulo („%“) s číslem currentFrame, aby bylo možné nakreslit snímky v mřížce čtyř po třech. Pak je zde jednoduché volání OpenCV, které je vzhledem k kontextu skutečně v pohodě:

opencv.threshold (150);

To říká našemu opencv objektu, aby vyrovnal rám s čistě černobílým obrazem, což eliminuje všechny odstíny šedé. Rozhoduje, které části se mají udržet na základě hodnoty stupně šedi, kterou projdeme, 150. Jelikož však hodnoty ve stupních šedi v našem obraze hloubky odpovídají skutečné fyzické vzdálenosti objektů, v praxi to znamená, že jsme v obraze odstranili cokoliv dále. než pár stop, takže na obrázku zůstane jen náš předmět.

Pokud používáte svůj vlastní obrázek hloubky, budete zde chtít experimentovat s různými hodnotami, dokud neuvidíte siluetu, která představuje pouze obrázek, který chcete zachytit v animaci.

Dalších několik řádků, zabalených mezi hovory do „pushMatrix ()“ a „popMatrix ()“, je pravděpodobně nejskvělejší v náčrtu. Naštěstí je můžeme rozdělit na dvě části, abychom je pochopili: pohyb a škálování obrazu a kreslení siluety vypočítané OpenCV.

První tři řádky této sekce nedělají nic jiného, ​​než změnit náš referenční rámec. pushMatrix () a popMatrix () je podivně pojmenovaná konvence, která značně usnadňuje komplikovaný kód kreslení. To, co nám dovoluje, je dočasně změnit velikost a tvar naší skici zpracování tak, abychom mohli znovu a znovu používat stejný kód pro kreslení v různých měřítcích a na různých částech obrazovky.

pushMatrix (); překládat (x + 20, y); měřítko (0,2);

Jak to funguje? Nejdříve voláme pushMatrix (), což znamená: „zachránit naše místo“, takže můžeme na něj skočit, když voláme popMatrix (). Pak nazýváme „přeložit ()“, který nás přesouvá do jiné části skici pomocí proměnných x a y, které jsme nastavili na základě našeho aktuálního rámce. Pak nazýváme „scale ()“, takže cokoli jiného, ​​než nakreslíme další popMatrix (), bude 20% velikosti, kterou by normálně byla.

Výsledkem těchto tří řádků je to, že můžeme udělat část OpenCV, která je příští - výpočet a kreslení kontury - aniž bychom museli přemýšlet o tom, kde na obrazovce probíhá. Bez pushMatrix bychom museli přidat všechny hodnoty x a y do všech našich souřadnic a vynásobit všechny naše velikosti o 0,2. Díky tomu jsou věci mnohem jednodušší.

Kód OpenCV:

Blob [] blobs = opencv.blobs (1, width * height / 2, 100, true, OpenCV.MAX_VERTICES * 4); pro (int i = 0; i

Tento kód určitě vypadá komplikovaně, ale není to tak špatné. Nejzajímavější je první, která volá „opencv.blobs ()“. Tato funkce analyzuje obraz, který jsme uložili, a hledá oblasti, které jsou spojité, kde všechny sousední pixely mají stejnou barvu. V případě našeho ukázkového filmu bude přesně jedna blob a bude to kolem Zachovy siluety. Naše použití prahu eliminovalo všechno ostatní ze scény. Pokud používáte můj další ukázkový film nebo vlastní film s hloubkou, můžete mít více blobů a to je v pořádku, budete muset skončit s komplikovanějším vektorovým souborem.

A jakmile se k tomu dostaneme, není ani tahání těchto blobů příliš špatné. My smyčku přes pole je a každý blob má pole bodů uvnitř to že my přistupujeme za účelem vytvoření vektorů. V podstatě hrajeme spojení teček: jdeme z každého bodu na další čáry kreslení mezi nimi, dokud nedokončíme celý tvar.

A to je vše, co je pro generování souboru DXF.

Příprava na laser

Po vygenerování tohoto souboru DXF ho musíte přenést do Illustratoru nebo do svého oblíbeného programu pro editaci vektorů, abyste provedli základní čištění: seskupte každý snímek do jednoho objektu, vystřižte části siluety, které se překrývají s obdélníkem tak, aby postava bude skutečně připojena k jeho základně, atd. Také jsem vybral 9 z těchto dvanácti rámců a pak duplikovat je tak, že bych měl smyčku animace, spíše než ten, který resetovat zpět na výchozí pozici. Poslední soubor Illustratoru jsem nahrál sem, abyste se mohli podívat na: contour_animation_for_laser.ai

Jakmile dostaneme výřez kontur, posledním krokem je design a oříznutí kola, na kterém se točí. Získal jsem tahové ložisko (jakýsi inženýrský líný susan), který by umožnil, aby se můj disk volně otáčel. Mé ložisko obsahovalo otvory nahoře pro připevnění věcí. Měřil jsem vzdálenost mezi nimi a pak sestavil design pro disk, který by se mohl namontovat na ložisko a držet každý z rámců animace:

Získání správné velikosti pro sloty tak, aby siluety stačily těsně zapadnout bez jakéhokoliv lepidla, udělalo trochu experimentování a některé falešné starty na laseru. Soubor Illustratoru si můžete stáhnout zde: contour_disc_for_laser.ai

Jakmile budete mít tyto dva soubory Illustratoru, jejich vyříznutí na laseru je téměř stejně snadné jako tisk. Doslovně: proces skutečně spustíte stisknutím klávesy Illustrator. Musíte vyplnit několik dalších informací o nastavení výkonu a rychlosti laseru, ale pak jste na závodech. Laser vypadá takto v akci (v tomto případě neříze část zoetrope, ale je to stejný laser):

Doufejme, že tento tutoriál vám poskytl dostatek informací o tom, co potřebujete k tomu, abyste mohli začít nahrávat data o hloubce Kinect a používat je pro generování vektorových souborů s laserem. Bavte se!

Získejte své vlastní laserem řezané Zoetropes!

V reakci na všechny ohromné ​​reakce na tento projekt jsem spustil web, ve kterém lze skutečně vyrábět laserem řezané zoetropy ke koupi: PhysicalGIF.com. Nabízíme Vám sady pro sestavování zoetrop z animovaných GIF. Soupravy se dodávají se vším, co potřebujete k sestavení zoetrope, jako je ten zde zobrazený: laserem řezané části, základna, dokonce i bleskové světlo. Nakonec budete dokonce moci nahrát své vlastní soubory GIF, aby byly převedeny do fyzické podoby. Hlavu tam teď podepsat a být upozorněn, když budou k dispozici sady.

Více: Podívejte se na všechny sloupce Codebox zde Navštivte naši stránku Make: Arduino pro více informací o tomto populárním mikrokontroléru hobby

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ář