Kodekasse: Løs hovedet med OpenCV - 💡 Fix My Ideas

Kodekasse: Løs hovedet med OpenCV

Kodekasse: Løs hovedet med OpenCV


Forfatter: Ethan Holmes, 2019

OpenCV er et "bibliotek af programmeringsfunktioner til real-time computersyn". Et open source-projekt understøttet af Willow Garage, indeholder biblioteket over 500 algoritmer til billedmanipulation, objektdetektering, ekstraktionsfunktion og en række andre værktøjer, du kan bruge til at skriv programmer, der kan "se".

OPENCV-behandlings- og Java-biblioteket, et projekt, der opretholdes af Stéphane Cousot og Douglas Edric Stanley på Ã ‰ cle d'Supérieure d'Art d'Aix-en-Provence, giver et omslag, der giver dig mulighed for at bruge en delmængde af OpenCV I forarbejdning. Til ære for Halloween viser denne Codebox dig, hvordan du bruger OpenCV til at fjerne folks hoveder i realtid fra et videoføde. For eksempel:

Fremtidige stillinger vil dække mindre grusomme ansøgninger til dette fantastiske bibliotek.

Installation af OpenCV-behandling og Java-bibliotek

Fistetrin i brug af biblioteket er at downloade og installere det fra http://ubaa.net/shared/processing/opencv/. Dokumentationsstedets hjemmeside er fantastisk - følg blot de trin, der er angivet på "Installationsvejledning" på hovedsiden. Når du har fulgt trinene, skal du slukke for Processing, og derefter prøve koden i detektere () -eksemplet, som sætter et rødt rektangel omkring alle ansigter (frontal view), der er registreret i webkameraet. Du skal se noget som dette:

Bemærk til Windows-brugere: Du skal muligvis installereQuicktime og WinVDIG for at bruge webkameraet i Processing.

Opsætning af skitse

Når du har fået det grundlæggende opdage() Eksempelarbejde, du kan bruge følgende skitse.Som med andre indlæg i denne serie kan du enten markere al teksten i boksen herunder og trykke på ctrl + c, eller gå direkte til Makezine-kodelageret og kopiere headless_cam.pde.

Når du starter programmet, skal du se en meddelelse om at "træde ud af scenen og trykke på en hvilken som helst tast." Når kyst er klart, skal du trykke på en hvilken som helst tast og gå tilbage til billedet. Du (og alle andre) skal, takket være OpenCV, være hovedløse. Når du bevæger dig rundt, bemærker du, at dit hoved blinker ind og ud - det sker, når noget interfererer med OpenCVs detekteringsalgoritme. Hvis du for eksempel lægger hånden foran dit ansigt, vil det "break" OpenCV-detekteringsalgoritmen.

Diskussion

Så hvordan virker denne ting? Det er ret simpelt, faktisk - hele skitsen gør, er at søge ansigter ved hjælp af OpenCVs opdage() metode og derefter erstatte de registrerede ansigter med de samme (men lidt større) pixels fra baggrundsbilledet, der er gemt i starten af ​​skissen. Dette gør ansigtet "forsvinde", for det meste. Små forskelle i belysning skaber små ændringer mellem de nye og de gamle billeder, hvilket gør det udskiftne ansigt til at virke lidt boxy. I teorien skal du kunne glatte nogle af disse ud med andre OpenCV-funktioner, men det er til fremtidige projekter.

Det første skridt i skissen er at gemme et billede af den tomme baggrundsscene. Dette gøres af kopi() kommando i keyPressed () metode:

bg.copy (cam, 0,0, bredde, højde, 0,0, bredde, højde);

Kommandoen kræver to billeder: a bestemmelsessted billede, hvilket er hvor pixlerne vil blive kopieret til, og a kilde billede, hvilket er hvor pixlerne vil blive kopieret fra. For at bruge det, ringer du til kopi() metode på destinationsbilledet (i dette tilfælde variablen bg) og levere de ni (!) krævede argumenter, som er:

  • Det kilde Billede, hvorfra vi ønsker at lave en kopi. I dette tilfælde bruger vi variablen cam, som indeholder den nuværende ramme fra webcam.
  • Området i kildebilledet, der skal kopieres. Dette område beskrives ved de fire følgende argumenter: x- og y-koordinaterne for det øverste venstre hjørne af regionen og regionens bredde og højde.
  • Området i destinationsbilledet, hvor de kopierede pixels vil gå. Disse ligner de tidligere fire argumenter, og består af x- og y-koordinaterne sammen med områdets bredde og højde. Hvis dimensionerne er forskellige mellem kilde- og destinationsområderne, vil Processing skalere billedet automatisk.

Når denne kommando er fuldført, har du en kopi af baggrundscenen gemt i variablen bg. Det næste skridt er at bruge OpenCV til at søge efter ansigter. Som beskrevet tidligere gøres dette ved hjælp af opdage() metode, som returnerer en række rektangler. Et rektangel er en klasse, der er inkluderet i Java, det grundlæggende sprog, hvorfra Processing er afledt. (En af de kølige ting om Processing er, at den kan bruge enhver kommando, du kan bruge i Java, hvilket gør det til et meget stærkt sprog.) Et rektangel har fire nøglefelter, der vedrører os: x- og y-koordinatet af dets øvre venstre hjørne og bredde og højde. (Sound familiar?)

Hvis alt, hvad vi ønskede at gøre, er at erstatte bare ansigtet, kan vi simpelthen bruge kopi() kommando at kopiere over de tilsvarende regioner. (Bemærk: loadPixels () og updatePixels () metode er nødvendig, når vi vil få adgang til eller opdatere pixels i et billede.) Her er koden:

fg.copy (cam, 0,0, bredde, højde, 0,0, bredde, højde); // Kopier kameraets billede til fg opencv.copy (cam); // Kopier billedet til openCVs buffer Rectangle [] faces = opencv.detect (); // detektere noget som hænger sammen med en FRONTALFACe for (int i = 0; i

Her er output:

Som du kan se, fjerner kun ansigtet ikke helt rigtigt, fordi meget af hovedet forbliver synligt. Så vi har også brug for en måde at øge boksens størrelse på. Dette er jobbet enlargeFaceBox (), som bruger en smule trigonometri forstørre kassen med en given procentdel og oversætter den langs sin diagonale. Følgende diagram viser hvad der sker:

Triglen kommer i spil ved beregning af de korrekte forskydninger, som vil glide rektanglet op ad diagonalen. Nøglefunktionen er ARCTAN2 (), som beregner vinklen mellem to punkter i forhold til x-aksen. (Denne vinkel kaldes ofte theta ved hjælp af gamle matematikere). Når du har theta, kan du bruge cos () og synd() funktioner til at beregne x- og y-forskydningerne dx og D y. Her er koden:

Rektangel enlargeFaceBox (float incPct, intx, int y, int w, int h) {float r = dist (0,0, w, h) / 2; // Beregner radius af center diagonal float theta = atan2 (h, w); // Beregner vinklen på diagonal float dx = r * incPct * cos (theta); // Find float dy = r * incPct * synd (theta); returnere nyt rektangel ((int) (x - dx), (int) (y - dy), (int) (w + 2 * dx), (int) (h + 2 * dy)); }

Endelig er vi nødt til at sørge for, at det forbliver inden for de synlige områder af skærmen, da vi forstørrer kassen, ligesom vi gjorde i Swat en (arraylist) af målprojekt, som er gjort her:

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

Og det er det. Håber du kan finde en uhyggelig brug for dette på Halloween.

PS: Du kan lære de fulde detaljer om, hvordan du arbejder med billeder fra Daniel Shiffmans fremragende Billeder og Pixels-tutorial på webstedet Processing.org. (Kapitlet er et uddrag af hans vidunderlige bog, Learning Processing: En nybegynders guide til programmering af billeder, animation og interaktion, som jeg stærkt anbefaler dig at hente, hvis du virkelig vil mestre behandling.)

I Maker Shed:


Kom godt i gang med behandling Lær computerprogrammering på nem måde med Processing, et simpelt sprog, der giver dig mulighed for at bruge kode til at tegne tegninger, animationer og interaktiv grafik. Programmeringskurser starter normalt med teori, men i denne bog kan du springe lige ind i kreative og sjove projekter. Det er ideelt for alle, der ønsker at lære grundlæggende programmering, og tjener som en simpel introduktion til grafik til personer med nogle programmeringsevner.



Du Kan Være Interesseret

3D Udskrivning Navlestrengsklemmer i Haiti

3D Udskrivning Navlestrengsklemmer i Haiti


Se en DJ Control en Tesla Coil med sin drejeskive

Se en DJ Control en Tesla Coil med sin drejeskive


Dagens maker - Mikey Sklar, shirt med 38 arbejdende fans

Dagens maker - Mikey Sklar, shirt med 38 arbejdende fans


6 Cykler til cykling Træarbejde - Træbearbejdning

6 Cykler til cykling Træarbejde - Træbearbejdning






Seneste Indlæg