Jeffrey Cross
Jeffrey Cross

Codebox: Izgubite glavu s OpenCV-om

OpenCV je "biblioteka programskih funkcija za računalnu viziju u stvarnom vremenu." Projekt otvorenog koda podržan od Willow Garage, knjižnica sadrži preko 500 algoritama za manipulaciju slikama, otkrivanje objekata, izdvajanje značajki i razne druge alate koje možete koristiti za napisati programe koji mogu "vidjeti".

OPENCV obrada i Java knjižnica, projekt koji održavaju Stéphane Cousot i Douglas Edric Stanley u Colle Supérieure d'Art d'Aix-en-Provence, pruža omot koji vam omogućuje da koristite podskup OpenCV-a u procesu. U čast Halloween-a, ovaj kôd će vam pokazati kako koristiti OpenCV za uklanjanje glava osoba u stvarnom vremenu iz videozapisa. Na primjer:

Buduće će postove pokrivati ​​manje užasne aplikacije za ovu izvrsnu knjižnicu.

Instaliranje OpenCV obrade i Java knjižnice

Prvi korak u korištenju knjižnice je preuzimanje i instaliranje s http://ubaa.net/shared/processing/opencv/. Dokumentacija web-lokacije je izvrsna - samo slijedite korake navedene u "Upute za instalaciju" na glavnoj stranici. Nakon što ste slijedili korake, pokrenite Obradu, a zatim isprobajte kôd u primjeru detect () koji stavlja crveni pravokutnik oko lica (frontalni pogled) otkriven u web-kameri. Trebali biste vidjeti nešto poput ovoga:

Napomena za korisnike sustava Windows: možda ćete morati instaliratiQuicktime i WinVDIG da biste koristili web-kameru u obradi.

Postavljanje Skica

Nakon što dobijete osnovno otkriti() na primjer radi, možete koristiti sljedeću skicu.Kao i kod drugih postova u ovoj seriji, možete označiti cijeli tekst u donjem okviru i pritisnuti ctrl + c, ili otići izravno u spremište Makezine koda i kopirati headless_cam.pde.

Kada pokrenete program, trebali biste vidjeti poruku kako "izaći iz scene i pritisnuti bilo koju tipku". Kada je obala čista, pritisnite bilo koju tipku i vratite se na sliku. Vi (i bilo tko drugi) trebali biste, zahvaljujući OpenCV-u, biti bez glave. Dok se krećete, primijetit ćete da će vam glava treptati unutra i van - to se događa kada nešto ometa algoritam otkrivanja OpenCV-a. Na primjer, ako stavite ruku ispred lica, to će "slomiti" algoritam otkrivanja OpenCV-a.

Rasprava

Dakle, kako ova stvar funkcionira? Zapravo je prilično jednostavno - sve što skica radi je traženje lica pomoću OpenCV-a otkriti() i zamijenite otkrivena lica istim (ali malo većim) pikselima iz pozadinske slike spremljene na početku skice. Zbog toga lice uglavnom nestaje. Lagane razlike u osvjetljenju stvaraju male promjene između novih i starih slika, zbog čega se zamijenjeno lice pojavljuje malo malo. Teoretski, trebali biste biti u stanju izravnati neke od njih s drugim funkcijama OpenCV-a, ali to je za buduće projekte.

Prvi korak u skici jest spremanje slike prazne pozadinske scene. To je učinio kopirati() naredbu u keyPressed () metoda:

bg.copy (kamera, 0,0, širina, visina, 0,0, širina, visina);

Naredba zahtijeva dvije slike: a odredište slike, gdje će se kopirati pikseli do, i a izvor slike, gdje će se kopirati pikseli iz, Da biste ga koristili, nazovite kopirati() metoda na odredišnoj slici (u ovom slučaju varijabla bg) i dostavite devet (!) potrebnih argumenata, koji su:

  • izvor sliku iz koje želimo napraviti kopiju. U ovom slučaju koristimo varijablu breg, koji sadrži trenutni okvir web-kamere.
  • Područje u izvornoj slici koje treba kopirati. Ovo područje opisano je sljedećim četirima argumentima: x i y koordinatama gornjeg lijevog ugla regije, te širinom i visinom regije.
  • Područje u odredišnoj slici gdje će kopirati pikseli. One su slične prethodnim argumentima i sastoje se od koordinata x i y, zajedno s širinom i visinom područja. Ako se dimenzije razlikuju između izvornog i odredišnog područja, Obrada će automatski povećati veličinu slike.

Nakon dovršetka ove naredbe imat ćete kopiju pozadinske scene spremljene u varijable bg, Sljedeći korak je korištenje OpenCV-a za traženje lica. Kao što je opisano ranije, to se radi pomoću otkriti() metoda, koja vraća niz Pravokutnika. Pravokutnik je klasa koja je uključena u Java, osnovni jezik iz kojeg je izvedena obrada. (Jedna od cool stvari u obradi je da može koristiti bilo koju naredbu koju možete koristiti u Javi, što je doista vrlo moćan jezik.) Pravokutnik ima četiri ključna polja koja nas se tiču: koordinate x i y gornjeg lijevi kut i širinu i visinu. (Zvuči poznato?)

Ako je sve što smo htjeli učiniti zamijeniti samo lice, možemo jednostavno koristiti kopirati() naredbu za kopiranje preko ekvivalentnih regija. (Napomena: loadPixels () i updatePixels () Metoda je potrebna kad god želimo pristupiti ili ažurirati piksele na slici.) Evo koda:

fg.copy (kamera, 0,0, širina, visina, 0,0, širina, visina); // Kopirajte sliku kamere u fg opencv.copy (cam); / / Kopirajte sliku u openCV-ov međuspremnik Rectangle [] faces = opencv.detect (); // detektira bilo što što sastavlja FRONTALFACe za (int i = 0; i

Evo rezultata:

Kao što možete vidjeti, uklanjanje samo lica nije sasvim ispravno, jer puno glave ostaje vidljivo. Stoga ćemo također trebati način da povećamo veličinu okvira. Ovo je posao enlargeFaceBox (), koja koristi malo trigonometrije povećava okvir za određeni postotak i prevodi ga duž dijagonale. Sljedeći dijagram pokazuje što se događa:

Okidač dolazi u igru ​​pri izračunavanju točnih pomaka koji će pomaknuti pravokutnik prema gore dijagonalno. Ključna funkcija je ATAN2 (), koja izračunava kut između dvije točke u odnosu na x-os. (Ovaj se kut često naziva teta starih matematičara). Jednom kad jesi teta, možete koristiti cos () i grijeh() funkcije za izračunavanje pomaka x i y dx i dy, Evo koda:

Pravokutnik enlargeFaceBox (float incPct, int x, int y, int w, int h) {float r = dist (0,0, w, h) / 2; // Izračunava radijus središnje dijagonale plutajuće tea = atan2 (h, w); // Izračunava kut dijagonalne plovke dx = r * incPct * cos (theta); // pronalazi float dy = r * incPct * sin (theta); vrati novi pravokutnik ((int) (x - dx), (int) (y - dy), (int) (w + 2 * dx), (int) (h + 2 * dy)); }

Konačno, budući da povećavamo okvir, moramo se pobrinuti da ostane u vidljivim dijelovima zaslona, ​​kao što smo to učinili u projektu Swat (arrailist) ciljeva, što je sve učinjeno ovdje:

faceBox = enlargeFaceBox (0.75, lica [i] .x, lica [i] .y, lica [i]. širina, lica [i]. visina); 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> visina) {faceBox.height = height - faceBox.y; } ...

I to je to. Nadam se da možete naći jezivu upotrebu za ovo na Noć vještica.

PS: Možete saznati sve pojedinosti o tome kako raditi s slikama iz izvrsnog vodiča za slike i piksele Daniela Shiffmana na stranici Processing.org. (Poglavlje je odlomak iz njegove prekrasne knjige, Učenje obrade: Vodič za početnike za programiranje slika, animacije i interakcije, koje preporučujem da pokupite ako želite stvarno ovladati obradom.)

U skladištu za kavu:


Početak rada s obradom Naučite programiranje računala na jednostavan način s obradom, jednostavnim jezikom koji vam omogućuje da koristite kod za izradu crteža, animacije i interaktivne grafike. Programski tečajevi obično počinju s teorijom, ali ova knjiga omogućuje vam da skočite izravno u kreativne i zabavne projekte. Idealan je za svakoga tko želi naučiti osnovno programiranje i služi kao jednostavan uvod u grafiku za osobe s određenim vještinama programiranja.

Udio

Ostavite Komentar