Kinect ja Processing

Microsoftin Kinect-anturi on oheislaite (suunniteltu XBox-ja windows-tietokoneille), joka toimii paljon Verkkokameran tavoin. RGB-kuvan lisäksi se tarjoaa kuitenkin myös syvyyskartan. Merkitys jokaisen pikselin nähnyt anturi, Kinect mittaa etäisyyttä anturin. Tämä tekee erilaisia tietokoneen näköongelmia, kuten taustan poisto, möykky havaitseminen, ja helpompaa ja hauskaa!

Kinect-anturi mittaa itse vain väriä ja syvyyttä. Kuitenkin, Kun tämä tieto on tietokoneessa, paljon muuta voidaan tehdä, kuten ”luuranko” seuranta (eli havaita malli henkilö ja seuranta hänen/hänen liikkeitä). Voit tehdä luurankoseurannan käyttämällä Thomas Lenglingin windows-vain Kinect v2 processing libray. Kuitenkin, Jos olet Mac ja kaikki mitä haluat on raakadataa Kinect, olet onnea! Tämä kirjasto käyttää libfreenect-ja libfreenect2-avoimen lähdekoodin ajureita näiden tietojen käyttämiseen Mac OS X: lle (windows-tuki tulossa pian).

mitä laitteistoa tarvitsen?

ensin tarvitaan ”stand-alone” – kinekti. Sinun ei tarvitse ostaa Xboxia.

  • itsenäinen Kinect-anturi v1. Uskon, että tämä tulee virtalähteen kanssa, joten et tarvitse erillistä adapteria, joka on lueteltu seuraavaksi. Jos sinulla on kuitenkin Xboxin mukana tullut kinect v1, se ei sisällä Kinect-anturin virtalähdettä.
  • itsenäinen Kinect-anturi v2. Tarvitset todennäköisesti myös Kinect-sovittimen Windowsille. Älä heitetään pois, vaikka siinä lukee windows, tämän avulla voit liittää sen Maciin USB: n kautta. Lopuksi, sinun kannattaa myös varmistaa, että tietokone tukee USB 3. Useimmissa nykyaikaisissa koneissa on, mutta jos olet epävarma, voit lukea lisää täältä Mac OS X: lle.

joitakin Lisähuomautuksia eri malleista:

  • Kinect 1414: tämä on alkuperäinen kinect ja toimii tällä sivulla dokumentoidun kirjaston kanssa Processing 3.0 beta-sarjassa.
  • Kinect 1473: tämä näyttää identtiseltä 1414: n kanssa, mutta on päivitetty malli. Sen pitäisi toimia tämän kirjaston kanssa, mutta minulla ei ole sellaista testattavana. Kerro minulle, jos se tekee tai ei!
  • Kinect for Windows version 1:???? Apua? Toimiiko tämä?
  • Kinect for Windows-versio 2: Tämä on upouusi kinect kaikkine XBox One-Kinectistä löytyvine ominaisuuksineen. Toimii myös tämän kirjaston kanssa!

SimpleOpenNI

voisi myös harkita SimpleOpenNI-kirjaston käyttöä ja lukea Greg Borensteinin Making Things See-kirjan. Opennissa on ominaisuuksia(luurankoseuranta, eleentunnistus jne.) jotka eivät ole saatavilla tässä kirjastossa. Valitettavasti, Openni on äskettäin ostanut Apple ja, vaikka luulin, että se oli suljettu, alas siellä näyttää olevan joitakin pyrkimyksiä elvyttää sitä!. On epäselvää, mikä on Opennien ja Simpleopennien tulevaisuus.

olen valmis aloittamaan juuri nyt

helpoin tapa asentaa kirjasto on Processing Contributions Manager Sketch → tuo kirjastot → lisää kirjasto ja etsi ”Kinect”. Painike näkyy merkitty ”asentaa”.Jos haluat asentaa sen manuaalisesti lataa viimeisin julkaisu ja pura se kirjastot-kansioon. Käynnistä käsittely uudelleen, avaa yksi esimerkeistä esimerkit-kansiossa ja olet hyvä mennä!

mitä on jalostus?

Processing on avoimen lähdekoodin ohjelmointikieli ja-ympäristö ihmisille, jotka haluavat luoda kuvia, animaatioita ja vuorovaikutuksia. Alun perin kehitetty toimimaan ohjelmiston luonnoskirja ja opettaa perusteet tietokoneohjelmoinnin sisällä visuaalisessa kontekstissa, käsittely on myös kehittynyt työkalu tuottaa valmiin ammatillisen työn. Nykyään on kymmeniätuhansia opiskelijoita, taiteilijoita, suunnittelijoita, tutkijoita ja harrastajia, jotka käyttävät prosessointia oppimiseen, prototyyppeihin ja tuotantoon.

mitä jos en halua käyttää prosessointia?

jos olet sinut C++: n kanssa, kannattaa harkita openframeworksin tai Cinderin käyttöä Kinectin kanssa. Näissä ympäristöissä on joitakin lisäominaisuuksia ja saatat myös saada C++ – nopeusedun syvyystietojen käsittelyssä jne.:

  • ofxKinect
  • Kinect CinderBlock
  • lisää resursseja: OpenKinect-projekti

mitä koodia kirjoitan?

ensimmäinen asia on sisällyttää oikeat tuontilausunnot koodin alkuun:

import org.openkinect.processing.*;

sekä viittaus Kinect kohteeseen, ts.

Kinect kinect;

sitten setup() voit alustaa kyseisen kinect-olion:

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

jos käytät Kinect v2: ta, käytä sen sijaan Kinect2-objektia.

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

kun olet tehnyt tämän, voit aloittaa pääsyn kinect-anturin tietoihin. Tällä hetkellä kirjasto tuo aineistoa saataville viidellä tavalla:

  • PImage (RGB) kinect-videokamerasta.
  • PImage (grayscale) kinect IR-kamerasta.
  • PImage (grayscale) jokaisen pikselin kirkkaus kartoitettuna syvyyteen (kirkkaampi = lähempänä).
  • PImage (RGB) jokaisen pikselin värisävy kartoitettuna syvyyteen.
  • int array raakojen syvyystietojen kanssa (11 bittinumeroa välillä 0-2048).

katsotaan näitä yksi kerrallaan. Jos haluat käyttää Kinectiä aivan kuten tavallista vanhaa nettikameraa, voit käyttää videokuvaa Pimityksenä!

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

voit kuitenkin kysyä tätä kuvaa kohdasta draw(), jos voit käyttää myös numeroa videoEvent() tietääksesi, milloin uusi kuva on saatavilla.

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

jos haluat IR-kuvan:

kinect.enableIR(true);

Kinectillä v1 ei saa sekä videokuvaa että IR-kuvaa. Ne molemmat siirretään takaisin kautta getveoimage () joten kumpi oli viimeksi käytössä on yksi saat. Kinect v2: lla ne ovat kuitenkin molemmat saatavilla erillisinä menetelminä:

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

nyt, jos haluat syvyyskuvan, voit pyytää harmaasävykuvan:

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

sekä raaka syvyystiedot:

int depth = kinect.getRawDepth();

kinect v1: n raw-syvyysarvot ovat välillä 0-2048, kinect v2: n osalta alue on välillä 0-4500.

värisyvyyskuvassa käytetään kinect.enableColorDepth(true);. Ja aivan kuten videokuvan kanssa, on syvyystapahtuma, johon pääsee tarvittaessa.

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

valitettavasti b / c RGB-kamera ja IR-kamera eivät fyysisesti sijaitse samassa paikassa, on stereonäköongelma. Pikseli XY yhdessä Kuvassa ei ole sama XY kuvassa kamerasta tuumaa oikealle. Kinect v2 tarjoaa niin sanotun” rekisteröidyn ” kuvan, joka kohdistaa kaikki syvyysarvot RGB-kameran kanssa. Tähän pääsee käsiksi seuraavasti:

PImage img = kinect2.getRegisteredImage()

lopuksi kinect v1: ssä (mutta ei v2: ssa) kamerakulmaa voi säätää myös setTilt() – menetelmällä.

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

joten, siinä sinulla on se, tässä ovat kaikki hyödylliset toiminnot, joita saatat tarvita Processing kinect-kirjaston käyttämiseen:

  • initDevice() — aloita kaikki (video, syvyys, IR)
  • activateDevice(int) – aktivoi tietty laite, kun useita laitteita yhdistetään
  • initVideo() — käynnistä vain video
  • enableIR(boolean) — IR-kameran kuvan kytkeminen päälle tai pois päältä (vain v1)
  • initDepth() — vain aloitussyvyys
  • enableColorDepth(boolean) — kytke syvyysarvot päälle tai pois päältä värikuvana
  • enableMirror(boolean) — peilaa kuva ja syvyystiedot (vain v1)
  • PImage getVideoImage() — Tartu RGB (tai IR v1) videokuvan
  • PImage getIrImage() — ota IR-kuva (vain v2)
  • PImage getDepthImage() — nappaa syvyyskartta kuva
  • PImage getRegisteredImage() — nappaa rekisteröity syvyyskuva (vain v2)
  • int getRawDepth() — nappaa raa ’ at syvyystiedot
  • float getTilt() — saada nykyinen anturi kulma (välillä 0 ja 30 astetta) (vain v1)
  • setTilt(float) — säädä anturikulma (0-30 astetta) (vain v1)

kaikkea muuta, voit myös katsoa javadoc viittaus.

esimerkkejä

sekä v1: lle että v2: lle on neljä perusesimerkkiä.

Näytä RGB -, IR-ja Syvyyskuvat

koodi v1:Rgbdeptest

koodi v2:RGBDepthTest2

tässä esimerkissä käytetään kaikkia edellä lueteltuja toimintoja kinect-anturin tietojen näyttämiseen.

useita laitteita

sekä v1-että v2-laitteissa on useita kinect-tukia.

Code for v1:MultiKinect

Code for v2: MultiKinect2

Point Cloud

Code for v1: PointCloud

Code for v2: PointCloud

Code for V2: PointCloud

Here, we ’ re doing something a bit fancier. Ensinnäkin käytämme prosessoinnin 3D-ominaisuuksia pisteiden piirtämiseen avaruudessa. Kannattaa tutustua kääntämiseen(), kiertämiseen(), pushmatrixiin (), popmatrixiin (). Tämä opetusohjelma on myös hyvä paikka aloittaa. Lisäksi esimerkissä käytetään Pvektoria kuvaamaan 3D-avaruudessa olevaa pistettä. Lisää täällä: PVector opetusohjelma.

tämän esimerkin varsinainen työ ei kuitenkaan tule minulta ollenkaan. Kinektin raa ’ at syvyysarvot eivät ole suoraan verrannollisia fysikaaliseen syvyyteen. Pikemminkin ne skaalautuvat syvyyden käänteisluvulla tämän kaavan mukaan:

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

sen sijaan, että tämä laskenta koko ajan, voimme precompute kaikki nämä arvot hakutaulukossa, koska on olemassa vain 2048 syvyysarvoja.

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;}

Kiitos Matthew Fisher edellä kaava. (Huomautus: jotta tulokset olisivat tarkempia, sinun pitäisi kalibroida erityinen kinect laite, mutta kaava on tarpeeksi lähellä minua, joten olen kiinni sitä nyt. Lisää kalibroinnista hetken kuluttua.)

lopuksi voidaan piirtää joitakin pisteitä syvyysarvojen perusteella metreinä:

 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(); } }

Keskimääräinen Pisteseuranta

Kinectin todellinen taika piilee sen tietokoneen näkökyvyssä. Syvyystietoa, voit tehdä kaikenlaisia hauskoja asioita, kuten sanoa: ”tausta on mitään yli 5 jalkaa. Älä välitä siitä!”Ilman syvyyttä taustojen poistoon liittyy kaikenlaisia huolellisia pikselivertailuja. Nopeana demonstrointina tästä ideasta tässä on hyvin perusesimerkki, joka laskee minkä tahansa pikselin keskimääräisen xy-sijainnin tietyn syvyyskynnyksen edessä.

v1: n lähde: keskiarvo

v2: n lähde: Averagepointracking2

tässä esimerkissä ilmoitan kaksi muuttujaa laskemaan yhteen kaikki asianmukaiset x: t ja y: T ja yhden muuttujan pitämään kirjaa siitä, kuinka monta niitä on.

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

sitten, aina kun löydämme tietyn pisteen, joka noudattaa meidän kynnys, lisään X ja y summa:

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

kun olemme valmiita, laskemme keskiarvon ja piirrämme pisteen!

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

mitä puuttuu?

  • kaikkea seurataan github-ongelmien kautta.

FAQ

  1. mitä syvyyskuvassa (v1) on varjoja? Kinect-Varjodiagrammi
  2. mikä on Kinectin näkemä syvyysalue? (v1) ~0,7–6 metriä tai 2,3–20 jalkaa. Huomaa, että saat mustia pikseleitä (tai raw-syvyysarvo 2048) molemmissa elementeissä, jotka ovat liian kaukana ja liian lähellä.

Vastaa

Sähköpostiosoitettasi ei julkaista.