Codebox: Az OpenCV-vel elveszíti a fejét - 💡 Fix My Ideas

Codebox: Az OpenCV-vel elveszíti a fejét

Codebox: Az OpenCV-vel elveszíti a fejét


Szerző: Ethan Holmes, 2019

Az OpenCV „a valós idejű számítógépes látás programozási funkcióinak könyvtára”. A Willow Garage által támogatott nyílt forráskódú projekt, a könyvtár több mint 500 algoritmust tartalmaz a képkezeléshez, az objektum észleléséhez, a funkciók kivonásához és számos más eszközhöz, amelyeket használhat írjon olyan programokat, amelyek „láthatják”.

Az OPENCV feldolgozó és Java könyvtár, a St Cousot és a Douglas Edric Stanley által támogatott projekt, amely az ole ole Cole Supéure d'Art d'Aix-en-Provence-ben található, olyan csomagolást biztosít, amely lehetővé teszi az OpenCV egy részhalmazának használatát feldolgozás alatt. A Halloween tiszteletére ez a Codebox megmutatja, hogyan használhatja az OpenCV-t az emberek fejének valós idejű eltávolítására egy videó feedről. Például:

A jövőbeli hozzászólások kevésbé szörnyű alkalmazásokat fednek le e félelmetes könyvtár számára.

Az OpenCV feldolgozása és a Java könyvtár telepítése

A könyvtár használatának első lépése, hogy letöltse és telepítse a http://ubaa.net/shared/processing/opencv/ címen. A webhely dokumentációja nagyszerű - csak kövesse a főoldalon található „Telepítési utasítások” részben leírt lépéseket. Miután követte a lépéseket, tüntesse fel a Feldolgozást, majd próbálja ki a kódot az észlelési () példában, amely egy piros téglalapot helyez el a webkamerában észlelt bármely arc (elülső nézet) körül. Látnia kell ilyet:

Megjegyzés a Windows-felhasználók számára: lehet, hogy telepítenie kell aQuicktime-t és a WinVDIG-et a webkamera feldolgozásához.

A vázlat beállítása

Miután megkapta az alapszintet érzékeli() például az alábbi vázlatot használhatja.Mint a sorozat többi bejegyzéséhez hasonlóan, az alábbi mezőben is kiemelheti az összes szöveget, és nyomja meg a ctrl + c billentyűkombinációt, vagy közvetlenül a Makezine kódtárba és a headless_cam.pde másolásához.

Amikor elindítja a programot, egy üzenetet kell látnia, hogy „lépjen ki a jelenetből és nyomja meg bármelyik gombot.” Miután a partvonal tiszta volt, nyomja meg bármelyik gombot, és járjon vissza a képbe. Önnek (és bárki másnak) az OpenCV-nek köszönhetően fejetlennek kell lennie. Ahogy mozogsz, észre fogod venni, hogy a fejed be- és kilép. Ez akkor történik, amikor valami zavarja az OpenCV észlelési algoritmusát. Például, ha a kezedet az arcod elé helyezed, ez meg fogja szakítani az OpenCV észlelési algoritmust.

Vita

Szóval, hogyan működik ez a dolog? Ez nagyon egyszerű, valójában - az összes vázlat az arcok keresése az OpenCV-k használatával érzékeli() módszerrel, majd cserélje ki az észlelt arcokat ugyanazokkal (de kissé nagyobb) pixelekkel a vázlat elején elmentett háttérképből. Ezzel az arc „többnyire eltűnik”. A megvilágítás enyhe különbségei kis változásokat hoznak létre az új és a régi képek között, így a kicserélt arc egy kicsit boxy. Elméletileg ezeket az OpenCV-funkciókkal kiegyensúlyozhatja, de ez a jövőbeli projektek esetében is.

A vázlat első lépése az üres háttérkép képének mentése. Ezt a másolat() parancs a keyPressed () eljárás:

bg.copy (cam, 0,0, szélesség, magasság, 0,0, szélesség, magasság);

A parancsnak két képre van szüksége: a cél kép, ahol a képpontok másolása megtörténik nak nek, és a forrás kép, ahol a képpontok másolása megtörténik tól től. A használatához hívja a másolat() módszer a célképen (ebben az esetben a változó bg) és adja meg a kilenc (!) szükséges argumentumot, amelyek:

  • A forrás kép, amelyről másolatot szeretnénk készíteni. Ebben az esetben a változót használjuk bütyök, amely tartalmazza a webkamera aktuális keretét.
  • A másolandó forráskép területe. Ezt a területet a következő négy argumentum írja le: a régió bal felső sarkának x és y koordinátái, valamint a régió szélessége és magassága.
  • A célképen lévő terület, ahol a másolt képpontok fognak eljutni. Ezek hasonlóak az előző négy argumentumhoz, és az x és y koordinátákból állnak, a terület szélességével és magasságával együtt. Ha a méretek különbözőek a forrás- és a célterületek között, a Feldolgozás automatikusan méretezi a képet.

Miután ez a parancs befejeződött, a háttérképet másolhatja a változóban bg. A következő lépés az OpenCV használata az arcok kereséséhez. Amint azt korábban leírtuk, ezt a érzékeli() metódus, amely egy sor téglalapot ad vissza. A téglalap egy olyan osztály, amely a Java-ban szerepel, amely a feldolgozás alapjául szolgáló alapnyelv. (A Feldolgozás egyik jó dolog az, hogy bármely olyan parancsot használhat, amelyet a Java-ban használhat, így nagyon erős nyelvet alkothat.) A téglalapnak négy kulcsfontosságú területe van: a felső és az x koordinátája a felső bal sarok, szélesség és magasság. (Ismerős?)

Ha mindent meg akarunk csinálni, csak az arcot kell kicserélnünk, egyszerűen használhatjuk másolat() parancsot, hogy másolja át a megfelelő régiókat. (Megjegyzés: a loadPixels () és updatePixels () módszert kell használni, ha a képpontokat szeretnénk elérni vagy frissíteni.) A kód:

fg.copy (cam, 0,0, szélesség, magasság, 0,0, szélesség, magasság); // Másolja a kamera képét az fg opencv.copy (cam) -ra; // Másolja a képet az openCV pufferébe Téglalap [] arcok = opencv.detect (); // észlelje a FRONTALFACe-t semmit, ami (int i = 0; i

Íme a kimenet:

Amint láthatod, csak az arc eltávolítása nem igazán jó, mert sok fej látható marad. Szükségünk lesz tehát a doboz méretének növelésére. Ez a munka enlargeFaceBox (), amely egy kis trigonometriát használ, növelje a dobozt egy adott százalékkal, és fordítsa át az átlója mentén. A következő ábra azt mutatja, hogy mi történik:

A trigger a megfelelő elmozdulások kiszámításakor jön létre, amelyek a téglalapot felfelé tolják. A legfontosabb funkció atan2 (), amely kiszámítja a két pont közötti szöget az x tengelyhez viszonyítva. (Ezt a szöget gyakran nevezik theta a régi matematikusok által). Ha már van theta, használhatja a kötözősaláta() és bűn() az x és y elmozdulások kiszámításához használható dx és dy. Íme a kód:

Téglalap nagyításaFaceBox (úszó incPct, int x, int y, int w, int h) {float r = dist (0,0, w, h) / 2; // A középső átlós úszó teta = atan2 (h, w) sugarát kiszámítja; // Kiszámítja a dx = r * incPct * cos (theta) átlós úszó szögét; // float dy = r * incPct * sin (theta) keresése; visszaadja az új téglalapot ((int) (x - dx), (int) (y - dy), (int) (w + 2 * dx), (int) (h + 2 * dy)); }

Végül, mióta bővítjük a dobozt, meg kell győződnünk arról, hogy a képernyő látható területein belül marad, éppúgy, mint a célprojekt Swat (tömblista) részében, ami itt történik:

faceBox = enlargeFaceBox (0,75, arcok [i] .x, arcok [i] .y, arcok [i] .szélesség, arcok [i] .magasság); ha (faceBox.x <0) {faceBox.x = 0; } if (faceBox.x + faceBox.width> szélesség) {faceBox.width = szélesség - faceBox.x; } if (faceBox.y <0) {faceBox.y = 0; } if (faceBox.y + faceBox.height> magasság) {faceBox.height = magasság - faceBox.y; } ...

És ez az. Remélem, hogy találhat egy hátborzongató felhasználást erre a Halloweenre.

PS: Megismerheti a Daniel Shiffman kiváló képek és képpontok bemutatójával készített képekkel kapcsolatos részleteket a Processing.org webhelyen. (A fejezet egy kivonat a csodálatos könyvéről, a Learning Processing: Kezdő útmutató a képek, animációk és interakciók programozásáról, amit nagyon ajánlom, ha fel szeretné venni a feldolgozást.)

A Maker Shedben:


Első lépések a feldolgozással Ismerje meg a számítógépes programozást a feldolgozással egyszerű módon, amely lehetővé teszi a kódok használatát rajzok, animációk és interaktív grafikák létrehozásához. A programozási kurzusok általában az elméletből indulnak ki, de ez a könyv lehetővé teszi, hogy közvetlenül a kreatív és szórakoztató projektekre ugorjon. Ideális azok számára, akik alapvető programozást akarnak tanulni, és egyszerű bemutatkozásként szolgálnak a programozáshoz szükséges grafikák számára.



Lehet, Hogy Érdekli

"Bug-in-a-Book" projekt a Spy Múzeumban

"Bug-in-a-Book" projekt a Spy Múzeumban


How-To: Készítsen csillogó fejpántokat

How-To: Készítsen csillogó fejpántokat


MAKE Karts and Wheels Contest: Nyissa meg!

MAKE Karts and Wheels Contest: Nyissa meg!


Végezze el: Végezze el a robotüzem befejezését

Végezze el: Végezze el a robotüzem befejezését