Jeffrey Cross
Jeffrey Cross

Izdelava laserskega rezanja z obdelavo in Kinectom

Ta šifrant vam pokaže, kako ustvarite fizični zoopet z uporabo obdelave, Kinecta in laserskega rezalnika. Skica se bo naložila v filmu, posnetem s Kinectove globinske kamere, z uporabo knjižnice Obdelava OpenCV, ki bo film spremenila v vrsto obrisov, in obrise v vektorski obliki shranite kot datoteko DXF, ki jo lahko pošljete laserskemu rezalcu. Razložil bom tudi zasnovo gledališkega mehanizma, ki daje vrtljivcu zoopet.

O Zoetropes

Pred skakanjem v kodo, malo kulturne zgodovine in navdiha. Zoetrope je bila priljubljena viktorijanska optična igračka, ki je ustvarila obliko animacije iz papirnega kroga. V krogu bi ustvarjalci zoetropov natisnili vrsto okvirjev iz animacije. Nato je krog obkrožen z neprosojnim diskom, iz katerega so izrezane številne reže. Ko se je papirni krog zavrtel, ga je gledalec pogledal skozi reže in si ogledal animacijo. Reže so delovale kot filmski projektor in gledalcu omogočajo, da v hitrem zaporedju vidijo le en okvir naenkrat, kar povzroči iluzijo gibanja.

V zadnjem času so ljudje začeli ugotoviti, kako doseči isto iluzijo s tridimenzionalnimi objekti. Umetnik Gregory Barsamian gradi skulpture, ki se vrtijo pred stroboskopi, da bi ustvarili iluzijo gibanja. Kipi so sestavljeni iz niza različnih predmetov na različnih stopnjah gibanja in strobe delujejo kot reže v zoetropi, da bi ustvarile iluzijo gibanja (Barsamian je morda poznal nekaj navijačev iz našega prejšnjega posnetka: Persistence of Vision Gregory Barsamian) .

Pixar je pred kratkim prevzel trik, da bi ustvaril fizični zoopet za svoj avli. Animatorji so bili prepričani, da je fizični zoetrope neprimerljiva predstavitev načela animacije: preoblikovanje niza fotografij v gibljive:

Torej, kaj je recept za fizično živalsko vrsto? Potrebujemo vrsto slik, ki predstavljajo zaporedne faze gibanja. Potem jih moramo preoblikovati v različne fizične objekte. Ko jih dobimo, potrebujemo mehanizem, ki ga lahko obrne. In nenazadnje, potrebujemo strobe svetlobo za »zamrznitev« vsakega predmeta v en okvir animacije.

Kako lahko to storimo sami? No, da bi dobili to vrsto predmetov, bomo izvlekli silhuete iz videa, ustvarjenega iz Kinecta. Nato bomo te silhuete spremenili v vektorsko datoteko, ki jo lahko uporabimo za nadzor laserskega rezalnika, da izrežemo vrsto akrilnih predmetov v obliki vsakega okvira naše animacije.

Potopimo se noter.

Snemanje filma globine

Prva stvar, ki jo morate narediti, je, da prenesete Kinect knjižnico Dan Shiffman za obdelavo in jo prenesete v mapo Obdelava knjižnic. Če ne veste, kako to storiti, ima Dan zelo jasna navodila na strani knjižnice Kinect.

To knjižnico bomo uporabili za snemanje globinskega filma iz Kinecta. (V teoriji boste morda lahko uporabili tudi običajno kamero in dobro osvetljeno sobo, toda kaj bi bilo zabavno?) K sreči je snemanje lastnega filma globine le nekaj vrstic kode, ki je oddaljena od primera Kinecta. v knjižnici za obdelavo:

Diskusija

Govorimo o tem, kako to deluje. Najprej vključimo knjižnico Kinect in knjižnico za obdelavo videa; To bomo potrebovali pozneje, da bi posneli film. Nato razglasimo objekte Kinect in MovieMaker.MovieMaker je predmet, ki bo naredil delo snemanja izhoda naše skice v filmsko datoteko.

V nastavitvah nastavimo hitrost sličic na 24, tako da se bo ujemala s filmom, ki ga posnamemo. Konfiguriramo tudi skico na 640 x 480, da se bo ujemala z velikostjo video slike, ki bo prišla iz Kinecta. Naredimo nekaj osnovnih Kinectovih nastavitev: povejte našem kinect objektu, da začne brati podatke iz naprave in omogoči globinsko sliko. Potem inicializiramo razred MovieMaker, mu dajemo nastavitev kakovosti, tip datoteke in ime datoteke. Več o tem, kako MovieMaker deluje v dokumentaciji za obdelavo, lahko preberete več. Pomembno je, da se hitrost sličic, ki jo prenašamo na MovieMaker, ujema s sliko, tako da se film predvaja s pravo hitrostjo.

Naša funkcija risanja je neverjetno preprosta. Vse, kar počnemo, je, da pokličemo kinect.getDepthImage () in s pomočjo funkcije Processing image () pripravimo izhodno vrednost na našo skico. To nam bo pokazalo sivinsko sliko, ki predstavlja zemljevid globine, ki jo Kinect izvleče iz scene. To bo črno-bela slika, kjer se barva sive barve vsake piksle ne ujema z barvo svetlobe predmeta, temveč s tem, kako daleč je bila od Kinecta. Bližji predmeti bodo imeli svetlejše pike in bodo bolj oddaljeni predmeti temnejši. Kasneje bomo lahko te piksle obdelali, da bomo lahko izbrali predmete na določeni globini za našo silhueto.

Zdaj, ko smo na zaslonu narisali globinsko sliko, je vse, kar moramo storiti, zajeti rezultat v nov okvir filma, ki ga posnamemo (mm.addFrame ()). Zadnja pomembna podrobnost skice je, da uporabljamo ključne dogodke, da bi si zagotovili način, da ustavimo in dokončamo film. Ko nekdo zadene preslednico, bo film ustavil snemanje in shranil datoteko. Prav tako moramo zapomniti, da naredimo nekaj čiščenja Kinecta ob izstopu ali pa bomo dobili napake, ko bomo ustavili našo skico.

Tukaj je primer, kako izgleda film, posnet s to skico:

Zdaj, če nimate Kinecta ali imate težave pri snemanju globinskega filma, ne obupajte! Še vedno lahko igrate skupaj z naslednjim korakom. Lahko si prenesete ta globinski film o tem, kako počnemo skakalnice, naravnost iz Vimeo: Kinect Test Movie za Laser Zoetrope. Naložil sem tudi film o globini, ki sem ga uporabil za končni laserski zoopet, prikazan zgoraj, če želite natančno slediti: Kinect Depth Test Movie. Ta kasnejši film vključuje Zacha Liebermana, umetnika in hekerja v New Yorku in enega od soustanoviteljev OpenFrameworks, bratranca Processing, ki temelji na C ++.

Ustvarjanje datoteke laserskega rezalnika

Zdaj, ko imamo film o globini, moramo napisati še eno skico za obdelavo, ki obdeluje ta film, izbere okvirje za našo animacijo, najde obrise naše slike in shrani vektorsko datoteko, ki jo lahko pošljemo laserskemu rezalcu.

Da bi to dosegli, bomo uporabili obdelavo knjižnice OpenCV in vgrajeno funkcijo beginRaw () obdelave. Ustvarite novo skico za obdelavo, jo shranite, ustvarite mapo »podatki« v mapi skice, premaknite film v globino (imenovan »test_movie.mov«) in prilepite slednjo izvorno kodo v svojo skico (ali jo prenesite iz datoteka lasercut_zoetrope_generator.pde):

Diskusija

Če to skico zaženete z drugim testnim filmom, ki sem ga povezal zgoraj, bo ustvaril naslednje rezultate:

… In bo shranil tudi datoteko, imenovano »full_output.dxf« v mapo skice. To je vektorska datoteka, ki jo lahko vnesemo v Illustrator ali kateri koli drug program za končno obdelavo, ki jo pošljemo laserskemu rezalcu.

Zdaj pa si poglejmo kodo.

Pri namestitvi datoteko test_movie.mov naložimo v OpenCV, kar bi moralo biti znano iz prejšnjih objav na OpenCV. Prav tako imenujemo beginRaw (), funkcijo Processing za ustvarjanje vektorskih datotek. beginRaw () bo povzročil, da bo naša skica zapisala vse svoje rezultate v novo vektorsko datoteko, dokler ne pokličemo endRaw (), tako da bomo lahko našo datoteko zgradili v večkratnih iteracijah zanka. V tem primeru ustvarjamo datoteko DXF in ne PDF, ker je ta format lažje obdelati za laser, ki potrebuje neprekinjeno linijo, da bi ustvaril zanesljiv izhod. Datoteke PDF, ki jih proizvaja obdelava, imajo običajno veliko ločenih segmentov, ki lahko povzročijo funky rezultate pri rezanju z laserjem, vključno s počasnejšimi opravili in neenakomerno debelino.

Zdaj, preden se potopimo v metodo risanja, malo o pristopu. Iz našega filma želimo izvleči 12 različnih okvirjev, ki bi bili odlični okvirji za našo animacijo. Nato želimo, da OpenCV izvleče svoje obrise (ali »konturo« v jeziku OpenCV), in končno želimo narisati tiste v mreži na zaslonu, da se ne prekrivajo, končna DXF datoteka pa bo vsebovala vse okvirje animacija.

Ta skica pristopa k tem težavam z ustvarjanjem spremenljivke “currentFrame”, ki je definirana zunaj risalne zanke. Nato se pri vsakem zagonu zanke za risanje ta spremenljivka poveča in jo uporabimo za vse, kar potrebujemo: skoči naprej v filmu, se premaknemo na drugo območje skice za risanje, itd. dokončal risanje vseh 12 okvirov na zaslon, pokličemo “endRaw ()”, da dokončamo DXF datoteko, tako kot smo jo imenovali “mm.finish ()” v prvi skici, da zapremo filmsko datoteko.

Torej, kako glede na celotno strukturo narišemo konturo za vsak okvir? Oglejmo si kodo:

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

To pove OpenCV, da skoči naprej v filmu za določeno časovno obdobje. 0.3 je izhodiščna točka okvirjev, ki jih bomo zgrabili, in nekaj, kar sem ugotovil z ugibanjem in preverjanjem. Preizkusila sem veliko različnih vrednot, vsakič sem vodila skico in videla, s kakšnimi okviri sem se odločila in presojala, ali bodo naredili dobro animacijo. »0,3« predstavlja začetni čas v sekundah.

Želimo, da so vsi naši okvirji enakomerno razporejeni, tako da se naša animacija čisto predvaja. Da bi to dosegli, dodamo naraščajoči znesek na naš skok 0,3, glede na okvir, na katerem smo. Ko izračunamo pravi čas, preberemo okvir filma z uporabo »opencv.read ()«

Naslednjih nekaj vrstic uporablja operater modulo (“%”) s številko trenutnega okvirja, da nariše okvirje v omrežju štirih s tremi. Potem je odprt klic preprostega videza, ki je dejansko zelo kul glede na kontekst:

opencv.threshold (150);

To pove našemu opencv objektu, da poravna okvir na čisto črno-belo sliko in tako odstrani vse odtenke sive. Odloči, kateri deli naj ostanejo na podlagi vrednosti sivine, ki jo prenašamo, 150. Ker pa sivinske vrednosti v naši globinski sliki ustrezajo dejanski fizični razdalji objektov, v praksi to pomeni, da smo vse, kar je na sliki, odpravili še dlje. nekaj metrov, tako da ostane samo naš motiv na sliki.

Če uporabljate lastno globinsko sliko, boste želeli tukaj eksperimentirati z različnimi vrednostmi, dokler ne vidite silhuete, ki predstavlja samo sliko, ki jo želite zajeti v animaciji.

Naslednjih nekaj vrstic, ki so zavite med klici na »pushMatrix ()« in »popMatrix ()«, so verjetno najbolj zmedene v skici. Na srečo jih lahko razdelimo na dva dela, da ju razumemo: premikanje in skaliranje naše podobe in risanje silhuete, ki jo izračuna OpenCV.

Prve tri vrstice tega poglavja ne spreminjajo našega referenčnega okvira. pushMatrix () in popMatrix () je nenavadno imenovana konvencija, ki znatno poenostavi zapleteno kodo za risanje. To, kar nam omogoča, je začasno spremeniti velikost in obliko naše skice za obdelavo, tako da lahko znova in znova uporabimo isto kodo za risanje za risanje na različnih ravneh in na različnih delih zaslona.

pushMatrix (); prevesti (x + 20, y); lestvica (0,2);

Tako deluje. Najprej imenujemo pushMatrix (), kar pomeni: »shranite naš prostor«, tako da lahko skočimo nazaj na to, ko pokličemo popMatrix (). Potem imenujemo »translate ()«, ki nas premakne na drug del skice z uporabo spremenljivk x in y, ki smo jih postavili na podlagi trenutnega okvira. Potem kličemo »scale ()«, tako da je vse, kar risimo, dokler bo naslednji popMatrix () 20 odstotkov velikosti, kot bi bilo običajno.

Rezultat teh treh vrstic je, da lahko naredimo del OpenCV, ki sledi - izračun in risanje konture - ne da bi morali razmišljati o tem, kje na zaslonu se to dogaja. Brez pushMatrix bi morali dodati naše x in y vrednosti v vse naše koordinate in pomnožiti vse naše velikosti z 0,2. To naredi stvari veliko enostavnejše.

Zdaj, koda OpenCV:

Blob [] blobs = opencv.blobs (1, širina * višina / 2, 100, res, OpenCV.MAX_VERTICES * 4); za (int i = 0; i

Ta koda se zdi zapletena, vendar ni tako slaba. Najbolj zanimiva vrstica je prva, ki kliče »opencv.blobs ()«. Ta funkcija analizira sliko, ki smo jo shranili, in išče področja, ki so neprekinjena, kjer so vse sosednje piksle iste barve. V primeru našega primera filma bo natanko ena blazina in bo okoli Zachove silhuete. Naša uporaba praga je izločila vse ostalo iz scene. Če uporabljate moj drug primer filma ali svoj globinski film, boste morda imeli več blobov in to je v redu, na koncu boste imeli bolj zapleteno datoteko vektorja.

In ko se lotimo tega, tudi risanje teh blobov ni slabo. Zanemo nad njimi matriko in vsaka kroglica ima v njem matrično točko, do katere dostopamo, da ustvarimo vektorje. Pravzaprav se igramo povezujemo pike: pojdite od vsake točke do naslednjih risarskih črt med njima, dokler ne dokončamo celotne oblike.

In to je vse, kar lahko ustvarite datoteko DXF.

Priprava na Laser

Ko ustvarite to datoteko DXF, jo boste morali vnesti v Illustrator ali vaš najljubši program za urejanje vektorjev, da boste izvedli nekaj osnovnega čiščenja: združite vsak okvir v en predmet, izrežite dele silhuet, ki prekrivajo pravokotnik, tako da Pravzaprav sem izbrala 9 od teh dvanajstih okvirjev in jih nato podvojila, tako da bi imela animacijo z zanko, ne pa tisto, ki se je vrnila na začetni položaj. Tukaj sem naložil končno datoteko Illustrator, da si ogledate: contour_animation_for_laser.ai

Ko dobimo izrez konture, je zadnji korak oblikovanje in rezanje kolesa, na katerem se bodo vrteli. Pridobil sem potisni ležaj (neke vrste inženirjev lenobni Susan), ki bi mojemu disku omogočil prosto vrtenje. Moje nošenje je vključevalo luknje na vrhu za pritrditev stvari. Izmeril sem razdaljo med temi in nato sestavil obliko za disk, ki bi se lahko pritrdil na ležaj in držal vsakega od okvirjev animacije:

Pridobitev prave velikosti za reže, tako da bi silhuete tesno prilepile brez kakršnegakoli lepila, je vzelo nekaj eksperimentiranja in nekaj napačnih začetkov na laserju. Datoteko Illustrator za to zasnovo lahko prenesete tukaj: contour_disc_for_laser.ai

Ko dobite ti dve datoteki Illustratorja, ju prerezujte na laserju skoraj tako enostavno, kot je tiskanje. Dobesedno: dejansko začnete postopek s pritiskom na tiskanje v Illustratorju. Morate izpolniti nekaj dodatnih podrobnosti o nastavitvah moči in hitrosti laserja, potem pa ste na dirkah. Laser izgleda tako v akciji (v tem primeru ne rezamo dela zoetrope, ampak je isti laser):

Upamo, da vam je ta vadnica dala dovolj, kar potrebujete za začetek snemanja podatkov o globini Kinecta in za njegovo uporabo za ustvarjanje vektorskih datotek, ki jih je mogoče rezati z laserjem. Zabavaj se!

Get Your Own lasersko Zoetropes!

Kot odziv na vse velike reakcije na ta projekt sem zagnal spletno mesto, ki dejansko proizvaja lasersko rezane zoetrope za nakup: PhysicalGIF.com. Ponujamo komplete za združevanje zoetropov iz oblikovanih animiranih GIF-ov. Kompleti bodo opremljeni z vsem, kar potrebujete, da sestavite živalsko vrvico, kot je prikazana tukaj: lasersko odrezani deli, osnova, celo stroboskop.Sčasoma boste lahko naložili svoje GIF-je, da jih pretvorite v fizično obliko. Pojdite tja, da se prijavite, da boste obveščeni, ko bodo kompleti na voljo.

Več: Oglejte si vse stolpce Codebox tukaj Obiščite našo Make: Arduino stran za več o tem priljubljenem hobi mikrokrmilniku

V skladišču izdelovalca:

Uvod v obdelavo Naučite se računalniškega programiranja na preprost način z Obdelovanjem, preprostim jezikom, ki vam omogoča uporabo kode za ustvarjanje risb, animacij in interaktivne grafike. Programski tečaji se običajno začnejo s teorijo, toda ta knjiga vam omogoča, da skočite naravnost v kreativne in zabavne projekte. Idealen je za vsakogar, ki se želi naučiti osnovnega programiranja in služi kot preprost uvod v grafiko za ljudi z nekaj programerskimi veščinami.

Delež

Pustite Komentar