az első lépések a Kinect-tel és a feldolgozással

a Microsoft Kinect érzékelő egy perifériaeszköz (XBox és windows PC-k számára tervezve), amely webkamerához hasonlóan működik. Az RGB kép biztosítása mellett azonban mélységtérképet is nyújt. A Kinect az érzékelő által látott minden Pixelhez méri az érzékelőtől való távolságot. Ez teszi a különböző számítógépes látás problémák, mint a háttér eltávolítása, blob felismerés, és több egyszerű és szórakoztató!

maga a Kinect érzékelő csak a színt és a mélységet méri. Azonban, ha ez az információ a számítógépen van, sokkal többet lehet tenni, mint a “csontváz” követés (azaz egy személy modelljének észlelése és mozgásának nyomon követése). Ehhez csontváz követés akkor kell használni Thomas Lengling csak windows Kinect v2 feldolgozó libray. Ha azonban Mac-et használ, és csak a Kinect nyers adatait szeretné, akkor szerencséje van! Ez a könyvtár libfreenect és libfreenect2 nyílt forráskódú illesztőprogramokat használ az adatok eléréséhez Mac OS X rendszeren (windows támogatás hamarosan).

milyen hardverre van szükségem?

először szüksége van egy “önálló” kinectre. Nem kell Xbox-ot vásárolni.

  • önálló Kinect érzékelő v1. Úgy gondolom, hogy ez a tápegységgel érkezik, így nincs szüksége külön adapterre a következő listában. Ha azonban Xbox konzolhoz kapott kinect v1-gyel rendelkezik, az nem tartalmazza a Kinect érzékelő tápegységét.
  • önálló Kinect érzékelő v2. Valószínűleg szüksége van a Windows Kinect adapterére is. Ne dobja le, bár azt mondja, hogy a windows, Ez lehetővé teszi, hogy USB-n keresztül csatlakoztassa a mac-hez. Végül azt is meg kell győződnie arról, hogy számítógépe támogatja az USB 3-at. A legtöbb modern gép igen, de ha nem biztos benne, többet megtudhat itt a Mac OS X-hez.

néhány további megjegyzés a különböző modellekről:

  • Kinect 1414: ez az eredeti kinect, és az ezen az oldalon dokumentált könyvtárral működik a Processing 3.0 béta sorozatban.
  • Kinect 1473: ez ugyanúgy néz ki, mint az 1414, de frissített modell. Működnie kell ezzel a könyvtárral, de nincs tesztelnivalóm. Kérem, tudassa velem, ha nem, vagy nem!
  • Kinect Windows 1-es verzióhoz: ???? Segíteni? Ez működik?
  • Kinect for Windows version 2: Ez a vadonatúj kinect az XBox One Kinect összes funkciójával. Ezzel a könyvtárral is működik!

SimpleOpenNI

megfontolhatja a SimpleOpenNI könyvtár használatát is, és elolvashatja Greg Borenstein make Things See book című könyvét. Az OpenNI rendelkezik funkciókkal (csontvázkövetés, gesztusfelismerés stb.), amelyek nem állnak rendelkezésre ebben a könyvtárban. Sajnos az OpenNI-t nemrégiben vásárolta meg az Apple, és bár azt hittem, hogy leállt, Úgy tűnik, hogy vannak erőfeszítések annak újjáélesztésére!. Nem világos, hogy mi lesz az OpenNI és a SimpleOpenNI jövője.

készen állok az indulásra

a könyvtár telepítésének legegyszerűbb módja a Processing Contributions Manager Sketch (vázlat). Megjelenik egy “telepítés”feliratú gomb.Ha manuálisan szeretné telepíteni, Töltse le a legfrissebb kiadást, majd bontsa ki a könyvtárak mappába. Indítsa újra a feldolgozást, nyissa meg az egyik példát a példák mappában, és jól megy!

mi a feldolgozás?

a Processing egy nyílt forráskódú programozási nyelv és környezet azok számára, akik képeket, animációkat és interakciókat szeretnének létrehozni. Kezdetben kifejlesztett, hogy szolgáljon a szoftver vázlatfüzet és tanítani alapjait számítógépes programozás vizuális kontextusban, feldolgozás is fejlődött egy eszköz generáló kész szakmai munka. Ma több tízezer diák, művész, tervező, kutató és hobbista használja a feldolgozást tanuláshoz, prototípuskészítéshez és gyártáshoz.

mi van, ha nem akarom használni a feldolgozást?

ha jól érzi magát a C++ – ban, azt javaslom, fontolja meg az openFrameworks vagy a Cinder használatát a Kinect segítségével. Ezeknek a környezeteknek van néhány további funkciója, és a C++ sebesség előnye is lehet A mélységi adatok feldolgozásakor stb.:

  • ofxKinect
  • Kinect CinderBlock
  • további források innen: az OpenKinect projekt

milyen kódot írjak?

az első dolog az, hogy tartalmazza a megfelelő import utasításokat a kód tetején:

import org.openkinect.processing.*;

csakúgy, mint egy Kinect objektumra való hivatkozás, azaz.

Kinect kinect;

ezután a setup() – ben inicializálhatja a kinect objektumot:

void setup() { kinect = new Kinect(this); kinect.initDevice();}

ha Kinect v2-t használ, használjon inkább Kinect2-objektumot.

Kinect2 kinect2;void setup() { kinect2 = new Kinect2(this); kinect2.initDevice();}

miután ezt megtette, elkezdheti elérni az adatokat a kinect érzékelőből. Jelenleg a könyvtár öt módon teszi elérhetővé az adatokat:

  • PImage (RGB) a kinect videokamerából.
  • PImage (grayscale) a kinect infravörös kamerából.
  • PImage (grayscale) minden pixel fényerejét mélységig leképezve (világosabb = közelebb).
  • PImage (RGB) minden pixel színárnyalatát mélységig leképezve.
  • int array nyers mélységi adatokkal (11 bites számok 0 és 2048 között).

nézzük meg ezeket egyenként. Ha a Kinectet ugyanúgy szeretné használni, mint egy szokásos régi webkamerát, akkor a videoképet PImage-ként érheti el!

PImage img = kinect.getVideoImage();image(img, 0, 0);

egyszerűen kérheti ezt a képet draw() – ban, azonban ha a videoEvent() – et is használhatja, hogy megtudja, mikor érhető el új kép.

void videoEvent(Kinect k) { // There has been a video event!}

ha az IR képet szeretné:

kinect.enableIR(true);

a kinect v1 nem tudja megszerezni mind a videoképet, mind az infravörös képet. Mindkettőt a getvideoimage() segítségével adják vissza, így amelyik Legutóbb engedélyezve volt, az lesz az, amit kap. A Kinect v2-vel azonban mindkettő külön módszerként kapható:

PImage video = kinect2.getVideoImage();PImage ir = kinect2.getIrImage();

most, ha szeretné a mélységi képet, kérheti a szürkeárnyalatos képet:

PImage img = kinect.getDepthImage();image(img, 0, 0);

valamint a nyers mélységi adatok:

int depth = kinect.getRawDepth();

a kinect v1 esetében a nyers mélységértékek 0 és 2048 között vannak, a kinect v2 esetében a tartomány 0 és 4500 között van.

a színmélység képhez használja a kinect.enableColorDepth(true); elemet. Csakúgy, mint a videókép esetében, van egy mélységi esemény, amelyhez szükség esetén hozzáférhet.

void depthEvent(Kinect k) { // There has been a depth event!}

sajnos b / c az RGB kamera és az IR kamera fizikailag nem ugyanazon a helyen található, sztereó látási probléma van. Pixel XY egy kép nem ugyanaz XY egy képet egy kamera egy hüvelyk jobbra. A Kinect v2 úgynevezett “regisztrált” képet kínál, amely az összes mélységi értéket igazítja az RGB kamerákhoz. Ez a következőképpen érhető el:

PImage img = kinect2.getRegisteredImage()

végül a kinect v1 (de nem v2) esetében a kamera szögét a setTilt() módszerrel is beállíthatja.

float angle = kinect.getTilt();angle = angle + 1;kinect.setTilt(angle);

tehát itt van, itt található az összes hasznos funkció, amelyre szüksége lehet A Kinect feldolgozó könyvtár használatához:

  • initDevice() — indítsa el mindent (videó, mélység, IR)
  • activateDevice(int) – egy adott eszköz aktiválása, ha több eszköz csatlakozik
  • initVideo() — csak videó indítása
  • enableIR(boolean) — az infravörös kamera képének be-vagy kikapcsolása (csak v1 esetén)
  • initDepth() — csak indítási mélység
  • enableColorDepth(boolean) — a mélységértékek be-vagy kikapcsolása színes képként
  • enableMirror(boolean) — tükrözze a kép-és mélységadatokat (csak v1)
  • PImage getVideoImage() — fogja meg az RGB (vagy IR for v1) videoképet
  • PImage getIrImage() — fogja meg az IR képet (csak v2)
  • PImage getDepthImage() — fogja meg a mélységtérképet kép
  • PImage getRegisteredImage() — fogja meg a regisztrált mélységi képet (csak v2)
  • int getRawDepth() — fogja meg a nyers mélységi adatokat
  • float getTilt() — szerezd meg az aktuális érzékelő szögét (0 és 30 fok között) (csak v1)
  • setTilt(float) — az érzékelő szögének beállítása (0 és 30 fok között) (csak v1)

minden máshoz megnézheti a javadoc referenciát is.

példák

négy alapvető példa van mind a v1, mind a v2 esetében.

kijelző RGB, IR, és mélység képek

Kód v1: RGBDepthTest

Kód v2:RGBDepthTest2

ez a példa a fent felsorolt összes funkciót használja a kinect érzékelő adatainak megjelenítéséhez.

több eszköz

mind a v1, mind a v2 több kinect támogatással rendelkezik.

a v1 kódja:MultiKinect

a v2 kódja:MultiKinect2

Point Cloud

a v1 kódja: PointCloud

a v2 kódja: PointCloud

itt egy kicsit kedvesebb dolgot csinálunk. Először is, a feldolgozás 3D-s képességeit használjuk, hogy pontokat rajzoljunk az űrben. Érdemes megismerkednie a fordítás(), forgatás(), pushMatrix (), popMatrix (). Ez az oktatóanyag szintén jó hely a kezdéshez. Ezenkívül a példa Pvektort használ a 3D-s tér egy pontjának leírására. További itt: PVector bemutató.

ennek a példának a valódi munkája azonban egyáltalán nem tőlem származik. A kinect nyers mélységértékei nem egyenesen arányosak a fizikai mélységgel. Inkább a mélység inverzével skálázódnak e képlet szerint:

depthInMeters = 1.0 / (rawDepth * -0.0030711016 + 3.3309495161);

ahelyett, hogy ezt a számítást mindig elvégeznénk, ezeket az értékeket előre kiszámíthatjuk egy keresési táblázatban, mivel csak 2048 mélységérték van.

float depthLookUp = new float;for (int i = 0; i < depthLookUp.length; i++) { depthLookUp = rawDepthToMeters(i);}float rawDepthToMeters(int depthValue) { if (depthValue < 2047) { return (float)(1.0 / ((double)(depthValue) * -0.0030711016 + 3.3309495161)); } return 0.0f;}

köszönet Matthew Fishernek a fenti képletért. (Megjegyzés: ahhoz, hogy az eredmények pontosabbak legyenek, kalibrálnia kell az adott kinect eszközt, de a képlet elég közel van hozzám, ezért egyelőre ragaszkodom hozzá. További információ a kalibrálásról egy pillanat alatt.)

végül néhány pontot rajzolhatunk a mélységértékek alapján méterben:

 for(int x = 0; x < w; x += skip) { for(int y = 0; y < h; y += skip) { int offset = x + y * kinect.width; // Convert kinect data to world xyz coordinate int rawDepth = depth; PVector v = depthToWorld(x, y, rawDepth); stroke(255); pushMatrix(); // Scale up by 200 float factor = 200; translate(v.x * factor, v.y * factor, factor-v.z * factor); // Draw a point point(0,0); popMatrix(); } }

átlagos Pontkövetés

a kinect igazi varázsa a számítógépes látás képességeiben rejlik. A mélységi információkkal mindenféle szórakoztató dolgot megtehet, például azt mondhatja:” a háttér bármi túl van 5 láb. Ne törődj vele!”Mélység nélkül a háttér eltávolítása mindenféle gondos pixel-összehasonlítást magában foglal. Ennek az ötletnek a gyors bemutatásaként itt van egy nagyon alapvető példa, amely kiszámítja bármely Pixel átlagos XY helyét egy adott mélységi küszöb előtt.

forrás a v1-hez: AveragePointTracking

forrás a v2-hez: AveragePointTracking2

ebben a példában két változót deklarálok, hogy összeadjam az összes megfelelő x – et és y-t, és egy változót, hogy nyomon kövessem, hány van.

float sumX = 0;float sumY = 0;float count = 0;

aztán, amikor találunk egy adott pontot, amely megfelel a küszöbünknek, hozzáadom az X-et és az y-t az összeghez:

 if (rawDepth < threshold) { sumX += x; sumY += y; count++; }

ha végeztünk, kiszámoljuk az átlagot és rajzolunk egy pontot!

if (count != 0) { float avgX = sumX / count; float avgY = sumY / count; fill(255, 0, 0); ellipse(avgX, avgY, 16, 16);}

mi hiányzik?

  • minden nyomon keresztül github kérdések.

GYIK

  1. milyen árnyékok vannak a mélységi képen (v1)? Kinect Árnyékdiagram
  2. mekkora mélységtartományt lát a kinect? (v1) ~0,7 – 6 méter vagy 2,3-20 láb. Megjegyzés: fekete pixeleket (vagy 2048-as nyers mélységértéket) fog kapni mindkét túl távoli és túl közeli elemnél.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.