Jeffrey Cross
Jeffrey Cross

Codebox: Kurangkan kepala anda dengan OpenCV

OpenCV adalah "perpustakaan fungsi pengaturcaraan untuk visi komputer masa nyata." Projek sumber terbuka yang disokong oleh Willow Garage, perpustakaan ini mengandungi lebih daripada 500 algoritma untuk manipulasi imej, pengesanan objek, pengekstrakan ciri, dan pelbagai alat lain yang boleh anda gunakan untuk tulis program yang boleh "lihat."

Pemprosesan OPENCV dan Perpustakaan Jawa, sebuah projek yang dikendalikan oleh Stà © phane Cousot dan Douglas Edric Stanley di à ‰ cole Supà © rieure d'Art d'Aix-en-Provence, menyediakan pembungkus yang membolehkan anda menggunakan subset OpenCV dalam proses. Untuk menghormati Halloween, Codebox ini akan menunjukkan kepada anda bagaimana menggunakan OpenCV untuk menghilangkan kepala orang secara langsung dari suapan video. Sebagai contoh:

Siaran masa depan akan meliputi aplikasi kurang mengerikan untuk perpustakaan hebat ini.

Memasang Pemprosesan OpenCV dan Perpustakaan Java

Langkah penumbuk dalam menggunakan perpustakaan adalah untuk memuat turun dan memasangnya dari http://ubaa.net/shared/processing/opencv/. Dokumentasi tapak hebat - hanya ikuti langkah-langkah yang disenaraikan di "Arahan Pemasangan" pada halaman utama. Sebaik sahaja anda telah mengikuti langkah-langkah, api Pemprosesan, dan kemudian cuba kod dalam contoh mengesan (), yang meletakkan segi empat merah di sekeliling mana-mana muka (paparan depan) yang dikesan dalam webcam. Anda sepatutnya melihat sesuatu seperti ini:

Nota untuk pengguna Windows: anda mungkin perlu memasangQuicktime dan WinVDIG untuk menggunakan webcam dalam Proses.

Menyediakan Lakaran

Sebaik sahaja anda mendapat asas mengesan () contoh kerja, anda boleh menggunakan lakaran berikut.Sama seperti catatan lain dalam siri ini, anda boleh menyerlahkan semua teks di dalam kotak di bawah dan tekan ctrl + c, atau pergi terus ke repositori kod Makezine dan salin headless_cam.pde.

Apabila anda memulakan program, anda akan melihat mesej untuk "melangkah keluar dari tempat kejadian dan tekan mana-mana kunci." Apabila pantai itu jelas, tekan mana-mana kunci dan kembali ke imej. Anda (dan orang lain) harus, terima kasih kepada OpenCV, menjadi tanpa kepala. Ketika anda bergerak, anda akan melihat bahawa kepala anda akan mengedip masuk dan keluar - ini berlaku apabila sesuatu mengganggu algoritma pengesanan OpenCV. Sebagai contoh, jika anda meletakkan tangan anda di hadapan wajah anda, ini akan "memecahkan" algoritma pengesanan OpenCV.

Perbincangan

Jadi, bagaimanakah perkara ini berfungsi? Ia cukup mudah, sebenarnya - semua lakaran tidak mencari muka menggunakan OpenCV mengesan () kaedah dan kemudian gantikan muka yang dikesan dengan pixel yang sama (tetapi sedikit lebih besar) dari imej latar belakang yang disimpan pada awal lakaran. Ini menjadikan wajah "hilang", kebanyakannya. Perbezaan sedikit dalam pencahayaan membuat perubahan kecil antara imej-imej baru dan lama, menjadikan wajah diganti kelihatan sedikit berkotak. Secara teori, anda sepatutnya dapat melancarkan beberapa perkara ini dengan fungsi OpenCV yang lain, tetapi itu adalah untuk projek masa depan.

Langkah pertama dalam lakaran adalah untuk menyimpan gambar latar belakang latar belakang kosong. Ini dilakukan oleh salinan() arahan dalam keyPressed () kaedah:

bg.copy (cam, 0,0, lebar, ketinggian, 0,0, lebar, tinggi);

Perintah ini memerlukan dua imej: a destinasi imej, di mana piksel akan disalin kepada, dan a sumber imej, di mana piksel akan disalin dari. Untuk menggunakannya, anda memanggil salinan() kaedah pada imej destinasi (dalam kes ini, pembolehubah bg) dan membekalkan sembilan (!) hujah yang diperlukan, iaitu:

  • The sumber imej dari mana kita mahu membuat salinan. Dalam kes ini kita menggunakan pemboleh ubah cam, yang mengandungi bingkai semasa dari webcam.
  • Kawasan dalam imej sumber yang akan disalin. Kawasan ini dijelaskan oleh empat argumen berikut: koordinat x dan y sudut kiri atas rantau ini, dan lebar dan ketinggian kawasan.
  • Kawasan dalam imej destinasi di mana piksel yang disalin akan pergi. Ini adalah sama dengan empat argumen sebelumnya, dan terdiri daripada koordinat x dan y, bersama dengan lebar dan ketinggian kawasan. Sekiranya dimensi adalah berbeza antara kawasan sumber dan destinasi, Pemprosesan akan menggerakan imej secara automatik.

Selepas arahan ini selesai, anda akan mempunyai salinan adegan latar belakang yang disimpan dalam pembolehubah bg. Langkah seterusnya ialah menggunakan OpenCV untuk mencari wajah. Seperti yang dijelaskan sebelum ini, ini dilakukan dengan menggunakan mengesan () kaedah, yang mengembalikan pelbagai Rectangles. A Rectangle adalah kelas yang termasuk dalam bahasa Jawa, bahasa asas dari mana Pemprosesan diperoleh. (Salah satu perkara yang sejuk tentang Pemprosesan ialah ia boleh menggunakan apa-apa perintah yang boleh anda gunakan di Jawa, menjadikannya bahasa yang sangat kuat.) Rectangle mempunyai empat bidang utama yang melibatkan kita: koordinat x dan y dari bahagian atasnya sudut kiri, dan lebar dan ketinggian. (Bunyi akrab?)

Jika semua yang kita mahu lakukan adalah menggantikan hanya muka, kita boleh menggunakannya salinan() arahan untuk menyalin wilayah yang bersamaan. (Nota: loadPixels () dan updatePixels () kaedah diperlukan apabila kami mahu mengakses atau mengemas kini piksel dalam imej.) Berikut ialah kod:

fg.copy (cam, 0,0, lebar, ketinggian, 0,0, lebar, ketinggian); // Salin imej kamera ke dalam fg opencv.copy (cam); // Salin imej ke dalam penampan openCV Rectangle [] faces = opencv.detect (); / // mengesan apa-apa yang menjejaskan FRONTALFACe untuk (int i = 0; i

Inilah outputnya:

Seperti yang anda dapat lihat, hanya mengeluarkan muka tidak cukup kerana banyak kepala masih kelihatan. Oleh itu, kami juga memerlukan cara untuk meningkatkan saiz kotak. Inilah tugasnya membesarkan Lock (), yang menggunakan sedikit trigonometri membesarkan kotak dengan peratusan yang diberikan dan menterjemahkannya di sepanjang pepenjuru. Rajah berikut menunjukkan apa yang berlaku:

Trig ini bermain apabila mengira anjakan yang betul yang akan melancarkan segi empat tepat sehingga pepenjuru. Fungsi utama ialah atan2 (), yang mengira sudut antara dua mata berbanding paksi-x. (Sudut ini sering dipanggil theta oleh ahli matematik lama). Sebaik sahaja anda mempunyai theta, anda boleh menggunakannya cos () dan dosa () berfungsi untuk mengira anjakan x dan y dx dan dy. Inilah kodanya:

Rectangle enlargeFaceBox (float incPct, int x, int y, int w, int h) {float r = dist (0,0, w, h) / 2; // Radius jari pusat pepenjuru diagonal float theta = atan2 (h, w); // Menentukan sudut float diagonal dx = r * incPct * cos (theta); // Cari float dy = r * incPct * sin (theta); kembali Rectangle baru (int) (x - dx), (int) (y - dy), (int) (w + 2 * dx), (int) (h + 2 * dy)); }

Akhir sekali, kerana kita membesarkan kotak itu, kita perlu memastikan ia kekal dalam kawasan yang kelihatan di skrin, sama seperti yang kita lakukan dalam Swat an (arraylist) projek target, yang semuanya dilakukan di sini:

faceBox = enlargeFaceBox (0.75, faces [i] .x, faces [i] .y, faces [i] .width, face [i] .height); jika (faceBox.x <0) {faceBox.x = 0; } if (faceBox.x + faceBox.width> width) {faceBox.width = width - faceBox.x; } if (faceBox.y <0) {faceBox.y = 0; } jika (faceBox.y + faceBox.height> height) {faceBox.height = height - faceBox.y; } ...

Dan, itu sahaja. Berharap anda dapat mencari penggunaan yang menyeramkan untuk ini pada Halloween.

PS: Anda boleh mengetahui butir-butir lengkap tentang bagaimana untuk bekerja dengan gambar dari tutorial Daniel Shiffman yang cemerlang dan Pixel di laman web Processing.org. (Bab adalah petikan dari buku indahnya, Pemprosesan Pembelajaran: Panduan Permulaan kepada Imej Pemrograman, Animasi, dan Interaksi, yang saya sangat mengesyorkan anda memilih jika anda mahu menguasai Proses Pengolahan.)

Dalam Maker Shed:


Bermula dengan Memproses Belajar pengaturcaraan komputer cara mudah dengan Pemprosesan, bahasa mudah yang membolehkan anda menggunakan kod untuk membuat lukisan, animasi, dan grafik interaktif. Kursus pengaturcaraan biasanya bermula dengan teori, tetapi buku ini membolehkan anda melompat ke dalam projek yang kreatif dan menyeronokkan. Ia sesuai untuk sesiapa sahaja yang ingin belajar pengaturcaraan asas, dan berfungsi sebagai pengenalan mudah kepada grafik untuk orang yang mempunyai kemahiran pengaturcaraan.

Kongsi

Meninggalkan Komen