Membuat Zoetrop Laser-potong dengan Pemrosesan dan Kinect - 💡 Fix My Ideas

Membuat Zoetrop Laser-potong dengan Pemrosesan dan Kinect

Membuat Zoetrop Laser-potong dengan Pemrosesan dan Kinect


Penulis: Ethan Holmes, 2019

Kotak kode ini menunjukkan kepada Anda cara membuat zoetrop fisik menggunakan Pemrosesan, Kinect, dan pemotong laser. Sketsa akan dimuat dalam film yang direkam dari kamera kedalaman Kinect, gunakan perpustakaan Pemrosesan OpenCV untuk mengubah film itu menjadi serangkaian garis besar, dan menyimpan garis besar dalam bentuk vektor sebagai file DXF yang dapat dikirim ke pemotong laser. Saya juga akan menjelaskan desain mekanisme penampil yang memberikan zoetrope putarannya.

Tentang Zoetropes

Sebelum masuk ke kode, sedikit sejarah budaya dan inspirasi. Zoetrope adalah mainan optik Victoria yang populer yang menghasilkan bentuk animasi dari lingkaran kertas. Di lingkaran, pembuat zoetrope akan mencetak serangkaian bingkai dari animasi. Maka lingkaran itu akan dikelilingi oleh cakram buram dengan serangkaian celah yang dipotong darinya. Ketika lingkaran kertas berputar, pemirsa akan melihatnya melalui celah dan melihat animasi. Celah bertindak seperti proyektor film, membiarkan penonton hanya melihat satu frame pada satu waktu berturut-turut, menghasilkan ilusi gerakan.

Baru-baru ini, orang-orang mulai mencari cara untuk mencapai ilusi yang sama dengan objek tiga dimensi. Seniman Gregory Barsamian membuat patung yang berputar di depan lampu sorot untuk menghasilkan ilusi gerak. Patung-patung terdiri dari serangkaian objek yang berbeda pada tahap gerak yang berbeda dan strobo bertindak seperti celah di zoetrope untuk menciptakan ilusi gerak (Barsamian mungkin akrab bagi beberapa penggemar dari liputan kami sebelumnya: Kegigihan Visi Gregory Barsamian) .

Pixar baru-baru ini mengambil trik untuk membuat zoetrop fisik untuk lobi mereka. Para animator di sana yakin bahwa zoetrope fisik adalah demonstrasi yang tak tertandingi dari prinsip animasi: transformasi serangkaian gambar foto menjadi gambar bergerak:

Jadi, apa resep untuk zoetrop fisik? Kami membutuhkan serangkaian gambar yang mewakili tahapan berurutan dalam satu gerakan. Maka kita perlu mengubah ini menjadi benda fisik yang berbeda. Setelah kami mendapatkannya, kami membutuhkan mekanisme yang dapat memutarnya. Dan, last but not least, kita membutuhkan lampu sorot untuk "membekukan" setiap objek menjadi satu bingkai animasi.

Bagaimana kita bisa melakukan ini sendiri? Nah, untuk mendapatkan rangkaian objek itu kita akan mengekstrak siluet dari sepotong video yang dihasilkan dari Kinect. Kami kemudian akan mengubah siluet itu menjadi file vektor yang dapat kita gunakan untuk mengontrol pemotong laser untuk memotong serangkaian objek akrilik dalam bentuk setiap bingkai animasi kita.

Mari selami.

Merekam Film Kedalaman

Hal pertama yang harus dilakukan adalah mengunduh perpustakaan Kinect Dan Shiffman untuk Diproses dan memasukkannya ke folder Pemrosesan perpustakaan Anda. Jika Anda tidak terbiasa dengan cara melakukan itu, Dan mendapat instruksi yang sangat jelas di halaman perpustakaan Kinect.

Kami akan menggunakan perpustakaan ini untuk merekam film mendalam dari Kinect. (Secara teori, Anda mungkin bisa juga menggunakan kamera konvensional dan ruangan yang cukup terang, tapi apa asyiknya itu?) Syukurlah, merekam film kedalaman Anda sendiri hanya beberapa baris kode dari contoh Kinect yang dikirimkan dengan perpustakaan pengolahan:

Diskusi

Mari kita bicarakan cara kerjanya. Pertama, kami menyertakan perpustakaan Kinect dan perpustakaan video Pemrosesan; kita akan membutuhkannya nanti untuk merekam film. Kemudian, kami mendeklarasikan objek Kinect dan MovieMaker. MovieMaker adalah objek yang akan melakukan pekerjaan merekam output dari sketsa kita ke file film.

Dalam pengaturan, kami mengatur frame rate ke 24 sehingga akan cocok dengan film yang kami rekam. Kami juga mengonfigurasi sketsa menjadi 640 x 480 agar sesuai dengan ukuran gambar video yang akan masuk dari Kinect. Kami melakukan beberapa pengaturan Kinect dasar: memberi tahu objek kinect kami untuk mulai membaca data dari perangkat dan mengaktifkan gambar kedalaman. Kemudian kami menginisialisasi kelas MovieMaker, memberikannya pengaturan kualitas, tipe file, dan nama file. Anda dapat membaca lebih lanjut tentang cara kerja MovieMaker dalam dokumentasi Pemrosesan. Penting agar frame rate yang kami berikan ke MovieMaker cocok dengan sketsa sehingga film kami diputar ulang dengan kecepatan yang tepat.

Fungsi menggambar kami sangat sederhana. Yang kita lakukan hanyalah memanggil kinect.getDepthImage () dan menggambar outputnya ke sketsa kita menggunakan fungsi Processing image (). Itu akan menunjukkan gambar grayscale yang mewakili peta kedalaman yang diekstraksi oleh Kinect dari lokasi. Ini akan menjadi gambar hitam dan putih di mana warna abu-abu dari masing-masing piksel tidak sesuai dengan warna cahaya objek tetapi seberapa jauh jaraknya dari Kinect. Objek yang lebih dekat akan memiliki piksel lebih terang dan objek yang lebih jauh akan lebih gelap. Nantinya, kami akan dapat memproses piksel ini untuk memilih objek pada kedalaman tertentu untuk siluet kami.

Sekarang setelah kami menggambar gambar dalam di layar, yang harus kami lakukan adalah menangkap hasilnya menjadi bingkai baru dari film yang kami rekam (mm.addFrame ()). Detail penting terakhir dari sketsa ini adalah bahwa kami menggunakan acara-acara penting untuk memberi diri kami cara menghentikan dan menyelesaikan film. Ketika seseorang menyentuh bilah spasi, film akan berhenti merekam dan menyimpan file. Juga, kita harus ingat untuk melakukan pembersihan Kinect saat keluar atau kita akan mendapatkan beberapa kesalahan funky setiap kali kita menghentikan sketsa kita.

Berikut ini contohnya tampilan film yang direkam dengan sketsa ini:

Sekarang, jika Anda tidak memiliki Kinect, atau Anda mengalami kesulitan merekam film yang mendalam, jangan putus asa! Anda masih bisa bermain bersama dengan langkah selanjutnya. Anda dapat mengunduh film kedalaman saya yang melakukan jumping jacks langsung dari Vimeo: Kinect Test Movie for Laser Zoetrope. Saya juga telah mengunggah film kedalaman yang saya gunakan untuk zoetrop laser akhir yang diperlihatkan di atas jika Anda ingin mengikuti persisnya: Kinect Depth Test Movie. Film itu nanti menampilkan Zach Lieberman, seorang seniman dan peretas di New York dan salah satu pendiri OpenFrameworks, sepupu Pemrosesan yang berbasis di C ++.

Membuat File Laser-Cutter

Sekarang setelah kita memiliki film yang mendalam, kita perlu menulis sketsa pemrosesan lain yang memproses film itu, memilih bingkai untuk animasi kita, menemukan garis besar gambar kita, dan menyimpan file vektor yang dapat kita kirim ke pemotong laser.

Untuk mencapai hal-hal ini, kita akan menggunakan pustaka pemrosesan OpenCV dan fungsi Processing beginRaw () bawaan. Buat sketsa pemrosesan baru, simpan, buat folder "data" di dalam folder sketsa, pindahkan film kedalaman Anda ke sana (bernama "test_movie.mov"), dan rekatkan kode sumber ikuti ke dalam sketsa Anda (atau unduh dari file lasercut_zoetrope_generator.pde):

Diskusi

Jika Anda menjalankan sketsa ini dengan film uji kedua yang saya tautkan di atas, itu akan menghasilkan output berikut:

... dan juga akan menyimpan file bernama "full_output.dxf" di folder sketsa. Ini adalah file vektor yang dapat kita bawa ke Illustrator atau program desain lainnya untuk pemrosesan akhir untuk dikirim ke pemotong laser.

Sekarang, mari kita lihat kodenya.

Dalam pengaturan, kami memuat file test_movie.mov ke dalam OpenCV, sesuatu yang harus familier dari posting sebelumnya di OpenCV. Kami juga memanggil beginRaw (), fungsi Pemrosesan untuk membuat file vektor. beginRaw () akan menyebabkan sketsa kami untuk merekam semua outputnya ke file vektor baru sampai kita memanggil endRaw (), dengan cara itu kita dapat membangun file kita melalui beberapa iterasi dari loop pengundian. Dalam hal ini kami membuat file DXF daripada PDF karena format ini lebih mudah diproses untuk laser yang membutuhkan garis kontinu untuk menghasilkan output yang andal. PDF yang diproduksi oleh Processing cenderung memiliki banyak segmen garis diskrit yang dapat menyebabkan hasil yang funky ketika dipotong dengan laser, termasuk pekerjaan yang lebih lambat dan ketebalan yang tidak rata.

Sekarang, sebelum kita masuk ke metode menggambar, sedikit tentang pendekatannya. Kami ingin mengeluarkan 12 frame berbeda dari film kami, itu akan menjadi frame yang bagus untuk animasi kami. Kemudian kami ingin OpenCV mengekstrak garis besarnya (atau "kontur" dalam bahasa OpenCV), dan akhirnya kami ingin menggambar yang ada di grid di layar sehingga mereka tidak tumpang tindih dan file DXF akhir akan berisi semua frame dari animasi.

Sketsa ini mendekati masalah ini dengan membuat variabel "currentFrame" yang ditentukan di luar loop undian. Kemudian, pada setiap putaran draw, variabel itu bertambah dan kita menggunakannya untuk melakukan semua yang kita butuhkan: melompat maju dalam film, bergerak ke area berbeda dari sketsa untuk menggambar, dll. Akhirnya, setelah kita selesai selesai menggambar semua 12 frame ke layar, kita memanggil "endRaw ()" untuk menyelesaikan file DXF, seperti yang kita sebut "mm.finish ()" di sketsa pertama untuk menutup file film.

Jadi, mengingat struktur keseluruhan itu, bagaimana kita menggambar kontur untuk setiap bingkai? Mari kita lihat kodenya:

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

Ini memberitahu OpenCV untuk melompat maju dalam film dengan jumlah waktu tertentu. 0,3 adalah titik awal dari frame yang akan kita ambil dan merupakan sesuatu yang saya ketahui dengan menebak-dan-periksa. Saya mencoba banyak nilai yang berbeda, menjalankan sketsa setiap kali dan melihat frame apa yang saya dapatkan dan menilai apakah mereka membuat animasi yang bagus. "0,3" menunjukkan waktu mulai dalam detik.

Kami ingin semua frame kami ditempatkan secara merata sehingga animasi kami diputar ulang dengan bersih. Untuk mencapai ini, kami menambahkan jumlah yang meningkat ke lompatan 0,3 kami berdasarkan pada frame mana kami berada. Setelah kami menghitung waktu yang tepat, kami membaca bingkai film menggunakan "opencv.read ()"

Beberapa baris berikutnya menggunakan operator modulo ("%") dengan nomor currentFrame untuk menggambar bingkai dalam kotak empat kali tiga. Lalu, ada panggilan OpenCV yang tampak sederhana yang sebenarnya cukup keren mengingat konteksnya:

opencv.threshold (150);

Ini memberi tahu objek OpenCV kita untuk meratakan bingkai menjadi gambar hitam putih murni, menghilangkan semua nuansa abu-abu. Itu memutuskan bagian mana yang harus dipertahankan berdasarkan nilai skala abu-abu yang kita lewati, 150. Tetapi karena nilai skala abu-abu dalam gambar kedalaman kita sesuai dengan jarak fisik sebenarnya dari objek, dalam praktiknya ini berarti bahwa kita telah menghilangkan apa pun dalam gambar lebih jauh. dari beberapa kaki, hanya menyisakan subjek kita terisolasi dalam gambar.

Jika Anda menggunakan gambar kedalaman Anda sendiri, Anda ingin bereksperimen dengan nilai yang berbeda di sini sampai Anda melihat siluet yang hanya mewakili gambar yang ingin Anda tangkap dalam animasi.

Beberapa baris berikutnya, terbungkus antara panggilan ke "pushMatrix ()" dan "popMatrix ()" mungkin yang paling membingungkan dalam sketsa. Untungnya, kita dapat memecahnya menjadi dua bagian untuk memahaminya: memindahkan dan memperbesar gambar kita dan menggambar siluet yang dihitung oleh OpenCV.

Tiga baris pertama dari bagian ini tidak melakukan apa pun selain mengubah kerangka referensi kami. pushMatrix () dan popMatrix () adalah konvensi yang diberi nama aneh yang membuat kode gambar rumit secara signifikan lebih mudah. Apa yang dapat kami lakukan adalah mengubah sementara ukuran dan bentuk sketsa Pemrosesan kami sehingga kami dapat menggunakan kode gambar yang sama berulang-ulang untuk menggambar pada skala yang berbeda dan pada bagian layar yang berbeda.

pushMatrix (); terjemahkan (x + 20, y); skala (0,2);

Begini cara kerjanya. Pertama-tama kita memanggil pushMatrix (), yang berarti: "save our place" sehingga kita dapat melompat kembali ketika kita memanggil popMatrix (). Kemudian kita memanggil "translate ()" yang menggerakkan kita ke bagian sketsa yang berbeda menggunakan variabel x dan y yang kita atur di atas berdasarkan bingkai kita saat ini. Kemudian kita memanggil "scale ()" sehingga apa pun yang kita gambar sampai popMatrix berikutnya () akan menjadi 20 persen dari ukuran normalnya.

Hasil dari tiga baris ini adalah kita dapat melakukan bagian OpenCV yang akan datang berikutnya - menghitung dan menggambar kontur - tanpa harus memikirkan di mana di layar ini terjadi. Tanpa pushMatrix kami harus menambahkan nilai x dan y kami ke semua koordinat kami dan mengalikan semua ukuran kami dengan 0,2. Ini membuat segalanya lebih sederhana.

Sekarang, kode OpenCV:

Gumpalan [] gumpalan = opencv.blobs (1, lebar * tinggi / 2, 100, benar, OpenCV.MAX_VERTICES * 4); untuk (int i = 0; i

Kode ini tentu terlihat rumit, tetapi tidak terlalu buruk. Baris yang paling menarik adalah yang pertama, yang memanggil "opencv.blobs ()". Fungsi itu menganalisis gambar yang kami simpan dan mencari area yang kontinu, di mana semua piksel yang berdekatan berwarna sama. Dalam kasus film contoh kami, akan ada tepat satu gumpalan dan akan ada di sekitar siluet Zach. Penggunaan ambang kami menghilangkan segala hal lain dari tempat kejadian. Jika Anda menggunakan film contoh saya yang lain atau film kedalaman Anda sendiri, Anda mungkin memiliki banyak gumpalan dan itu OK, Anda hanya akan berakhir dengan file vektor yang lebih rumit.

Dan begitu kita mulai, menggambar gumpalan ini juga tidak terlalu buruk. Kami mengulang larik mereka dan setiap gumpalan memiliki array poin di dalamnya yang kami akses untuk membuat vektor. Pada dasarnya, kami bermain menghubungkan titik-titik: pergi dari setiap titik ke garis gambar berikutnya di antara mereka sampai kami menyelesaikan seluruh bentuk.

Dan hanya itu yang ada untuk menghasilkan file DXF.

Mempersiapkan Laser

Setelah membuat file DXF ini, Anda harus membawanya ke Illustrator atau program pengeditan vektor favorit Anda untuk melakukan beberapa pembersihan dasar: kelompokkan setiap frame bersama menjadi satu objek, potong bagian-bagian dari siluet yang tumpang tindih dengan persegi panjang sehingga angka sebenarnya akan dilampirkan ke pangkalannya, dll. Saya juga memilih 9 dari dua belas frame ini dan kemudian menggandakannya sehingga saya akan memiliki animasi looping daripada yang mengatur ulang kembali ke posisi awal. Saya telah mengunggah file Illustrator terakhir di sini untuk Anda lihat: contour_animation_for_laser.ai

Setelah kami mendapatkan potongan kontur, langkah terakhir adalah merancang dan memotong roda yang akan mereka putar. Saya memperoleh bantalan dorong (sejenis susan malas insinyur) yang memungkinkan cakram saya berputar bebas. Bantalan saya termasuk lubang di bagian atas untuk menempelkannya. Saya mengukur jarak di antara mereka dan kemudian menyusun desain untuk sebuah cakram yang dapat dipasang pada bantalan dan menahan setiap bingkai dari animasi:

Mendapatkan ukuran yang tepat untuk slot sehingga siluet akan menempel dengan pas tanpa lem memerlukan sedikit percobaan dan beberapa kesalahan mulai pada laser. Anda dapat mengunduh file Illustrator untuk desain ini di sini: contour_disc_for_laser.ai

Setelah Anda mendapatkan dua file Illustrator itu, memotongnya menggunakan laser sama mudahnya dengan mencetak. Secara harfiah: Anda benar-benar memulai proses dengan menekan cetak di Illustrator. Anda harus mengisi beberapa detail tambahan tentang pengaturan daya dan kecepatan laser, tetapi kemudian Anda pergi ke balapan. Laser terlihat seperti ini dalam aksi (tidak memotong bagian zoetrope dalam kasus ini, tetapi lasernya sama):

Semoga tutorial ini telah memberi Anda cukup apa yang Anda butuhkan untuk mulai merekam data kedalaman Kinect dan menggunakannya untuk menghasilkan file vektor yang dapat dipotong dengan laser. Selamat bersenang-senang!

Dapatkan Zoetrop Laser-cut Anda Sendiri!

Menanggapi semua reaksi hebat terhadap proyek ini, saya telah memulai sebuah situs untuk benar-benar menghasilkan zoetrop potong laser untuk pembelian: PhysicalGIF.com. Kami menawarkan kit untuk menyusun zoetrop dari GIF animasi buatan desainer. Kit akan datang dengan semua yang Anda butuhkan untuk merakit zoetrope seperti yang diperlihatkan di sini: bagian potong laser, alas, bahkan lampu sorot. Akhirnya, Anda bahkan dapat mengunggah GIF Anda sendiri untuk mengubahnya menjadi bentuk fisik. Kepala di sana sekarang untuk mendaftar untuk diberitahu ketika kit tersedia.

Lebih lanjut: Lihat semua kolom Codebox di sini Kunjungi halaman Make: Arduino kami untuk informasi lebih lanjut tentang mikrokontroler hobi populer ini

Di Gudang Pembuat:

Memulai Memproses Mempelajari pemrograman komputer dengan cara yang mudah dengan Processing, bahasa sederhana yang memungkinkan Anda menggunakan kode untuk membuat gambar, animasi, dan grafik interaktif. Kursus pemrograman biasanya dimulai dengan teori, tetapi buku ini memungkinkan Anda terjun langsung ke proyek-proyek kreatif dan menyenangkan. Ini ideal untuk siapa saja yang ingin belajar pemrograman dasar, dan berfungsi sebagai pengantar sederhana untuk grafik untuk orang-orang dengan beberapa keterampilan pemrograman.



Anda Mungkin Tertarik

Panduan hadiah Culture Jamming di MAKE - retas, tempel, lempar, selai, dan inspirasi!

Panduan hadiah Culture Jamming di MAKE - retas, tempel, lempar, selai, dan inspirasi!


Menyinkronkan kit Firefly

Menyinkronkan kit Firefly


Panduan Hadiah Make: Buku - sains DIY, proyek, dan peretasan

Panduan Hadiah Make: Buku - sains DIY, proyek, dan peretasan


Proyek CRAFT: Tirai Dapur Tater-Stamped

Proyek CRAFT: Tirai Dapur Tater-Stamped






Recent Posts