Komme I Gang Med Kinect Og Behandling

Microsoft Kinect-sensoren er en ekstern enhet (designet For XBox og windows-Pcer) som fungerer omtrent som et webkamera. Men i tillegg til Å gi ET RGB-bilde, gir det også et dybdekart. Betydning For Hver piksel sett av sensoren, Måler Kinect avstanden fra sensoren. Dette gjør en rekke datasynproblemer som fjerning av bakgrunn, blob deteksjon og mer enkelt og morsomt!

Kinect-sensoren måler bare farge og dybde. Men når denne informasjonen er på datamaskinen, kan mye mer gjøres som» skjelett » sporing (dvs.oppdage en modell av en person og spore hans/hennes bevegelser). For å gjøre skjelettsporing må Du bruke Thomas Lenglings windows-only Kinect v2-behandling libray. Men hvis Du er På En Mac, og alt du vil ha er rådata Fra Kinect, har Du lykke til! Dette biblioteket bruker libfreenect og libfreenect2 åpen kildekode drivere for å få tilgang til disse dataene For Mac OS X (windows-støtte kommer snart).

hvilken maskinvare trenger jeg?

først trenger du en» frittstående » kinect. Du trenger ikke å kjøpe En Xbox.

  • Frittstående Kinect-Sensor v1. Jeg tror denne kommer med strømforsyningen, slik at du ikke trenger en separat adapter oppført neste. Hvis du har en kinect v1 som fulgte Med En XBox, vil Den imidlertid ikke inkludere Strømforsyningen Til Kinect-Sensoren.
  • Frittstående Kinect-Sensor v2. Du trenger også Sannsynligvis Kinect-Adapteren For Windows. Ikke bli kastet av, selv om det står windows, vil dette tillate deg å koble den til din mac via USB. Til slutt vil du også sørge for at datamaskinen støtter USB 3. De fleste moderne maskiner gjør det, men hvis du er usikker kan Du finne Ut mer her For Mac OS X.

noen flere notater om ulike modeller:

  • Kinect 1414: Dette er den originale kinect og fungerer sammen med biblioteket som er dokumentert på Denne siden i Betaserien Processing 3.0.
  • Kinect 1473: Dette ser identisk ut som 1414, men er en oppdatert modell. Det burde fungere med dette biblioteket, men jeg har ikke en til å teste. Gi meg beskjed om det gjør eller ikke!
  • Kinect For Windows versjon 1: ???? Hjelp? Fungerer denne?
  • Kinect For Windows versjon 2: Dette er den splitter nye kinect med alle funksjonene som finnes I XBox One Kinect. Fungerer også med dette biblioteket!

SimpleOpenNI

Du kan også vurdere å bruke SimpleOpenNI biblioteket og lese Greg Borensteins Making Things See book. OpenNI har funksjoner(skjelettsporing, gestgjenkjenning, etc.) som ikke er tilgjengelig i dette biblioteket. Dessverre Ble OpenNI nylig kjøpt av Apple, og mens jeg trodde det var stengt, ser det ut til å være noen forsøk på å gjenopplive det!. Det er uklart hva fremtiden vil være Av OpenNI Og SimpleOpenNI.

jeg er klar til å komme i gang akkurat nå

den enkleste måten å installere biblioteket på er Med Processing Contributions Manager Sketch → Importbiblioteker → Legg til bibliotek og søk etter «Kinect». En knapp vises merket «installer».Hvis du vil installere den manuelt, laster du ned den nyeste versjonen og pakker den ut i bibliotek-mappen. Start På Nytt, åpne et av eksemplene i eksempler-mappen, og du er god til å gå!

Hva Er Behandling?

Processing Er et åpen kildekode programmeringsspråk og miljø for folk som ønsker å lage bilder, animasjoner og interaksjoner. Opprinnelig utviklet for å tjene som en programvare skissebok og å lære grunnleggende programmering innenfor en visuell kontekst, Har Processing også utviklet seg til et verktøy for å generere ferdig faglig arbeid. I dag er det titusenvis av studenter, kunstnere, designere, forskere og hobbyister som bruker Prosessering for læring, prototyping og produksjon.

Hva om Jeg ikke vil bruke Processing?

hvis Du er komfortabel Med C++, foreslår jeg at du vurderer å bruke openFrameworks eller Cinder Med Kinect. Disse miljøene har noen ekstra funksjoner, og du kan også få En c++ hastighet fordel når du behandler dybdedata, etc.:

  • ofxKinect
  • Kinect CinderBlock
  • Flere ressurser Fra: The OpenKinect Project

hvilken kode skriver jeg?

Første er å inkludere riktig import uttalelser øverst i koden:

import org.openkinect.processing.*;

samt en referanse til et Kinect objekt, dvs.

Kinect kinect;

Deretter i setup() kan du initialisere det kinect-objektet:

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

Hvis Du bruker En Kinect v2, bruker Du Et Kinect2-objekt i stedet.

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

når du har gjort dette, kan du begynne å få tilgang til data fra kinect-sensoren. For øyeblikket gjør biblioteket data tilgjengelig for deg på fem måter:

  • PImage (RGB) fra kinect-videokameraet.
  • PImage (grayscale) fra kinect IR-kameraet.
  • PImage (grayscale) med hver piksel lysstyrke kartlagt til dybde(lysere = nærmere).
  • PImage (RGB) med hver piksel hue kartlagt til dybde.
  • int array med rå dybdedata (11 bit tall mellom 0 og 2048).

La oss se på disse en om gangen. Hvis Du vil bruke Kinect akkurat som et vanlig gammelt webkamera, kan du få tilgang til videobildet som En PImage!

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

Du kan bare be om dette bildet i draw(), men hvis du også kan bruke videoEvent() for å vite når et nytt bilde er tilgjengelig.

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

HVIS DU vil HA IR-bildet:

kinect.enableIR(true);

med kinect v1 kan du ikke få både videobildet og IR-bildet. De er begge sendt tilbake via getVideoImage (), så den som ble sist aktivert, er den du får. Men Med Kinect v2 er de begge tilgjengelige som separate metoder:

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

Nå, Hvis du vil ha dybdebildet, kan du be om gråtonebildet:

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

i tillegg til rå dybdedata:

int depth = kinect.getRawDepth();

for kinect v1 varierer raw-dybdeverdiene mellom 0 og 2048, for kinect v2 er området mellom 0 og 4500.

bruk kinect.enableColorDepth(true);for fargedybdebildet. Og akkurat som med videobildet, er det en dybdehendelse du kan få tilgang til om nødvendig.

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

Dessverre er b / c RGB-kameraet og IR-kameraet ikke fysisk plassert på samme sted, det er et stereovisjonsproblem. Pixel XY i ett bilde er ikke det samme XY i et bilde fra et kamera en tomme til høyre. Kinect v2 tilbyr det som kalles et» registrert » bilde som justerer alle dybdeverdiene med RGB-kameraene. Dette kan nås som følger:

PImage img = kinect2.getRegisteredImage()

til slutt, for kinect v1 (men ikke v2), kan du også justere kameravinkelen med setTilt() – metoden.

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

Så, der har du det, her er alle de nyttige funksjonene du kanskje trenger for Å bruke Processing kinect-biblioteket:

  • initDevice() — start alt (video, dybde, IR)
  • activateDevice(int) – aktivere en bestemt enhet når flere enheter kobles til
  • initVideo() — start video bare
  • enableIR(boolean) — slå PÅ ELLER AV IR-kamerabildet (kun v1)
  • initDepth() — start dybde bare
  • enableColorDepth(boolean) — slå på eller av dybdeverdiene som fargebilde
  • enableMirror(boolean) — speil bilde – og dybdedata (kun v1)
  • PImage getVideoImage() — ta TAK I RGB (ELLER IR for v1) videobildet
  • PImage getIrImage() — ta TAK I IR-bildet (kun v2)
  • PImage getDepthImage() — ta tak i dybdekartet bilde
  • PImage getRegisteredImage() — ta tak i det registrerte dybdebildet (kun v2)
  • int getRawDepth() — ta tak i rå dybdedata
  • float getTilt() — få gjeldende sensorvinkel (mellom 0 og 30 grader) (kun v1)
  • setTilt(float) — juster sensorvinkelen (mellom 0 og 30 grader) (kun v1)

For alt annet kan du også ta en titt på javadoc-referansen.

Eksempler

det er fire grunnleggende eksempler for både v1 og v2.

Vis Rgb -, IR-Og Dybdebilder

Kode for v1: RGBDepthTest

Kode for v2:RGBDepthTest2

dette eksemplet bruker alle de ovennevnte funksjonene til å vise dataene fra kinect-sensoren.

Flere enheter

både v1 og v2 har støtte for flere kinect.

Kode for v1: MultiKinect

Kode for v2: MultiKinect2

Punktsky

Kode for v1: PointCloud

Kode for v2: PointCloud

Her gjør vi noe litt mer avansert. Nummer en, vi bruker 3d-egenskapene Til Behandling for å tegne poeng i rommet. Du vil gjøre deg kjent med translate(), rotate(), pushMatrix (), popMatrix (). Denne opplæringen er også et godt sted å starte. I tillegg bruker eksemplet En Pvektor for å beskrive et punkt I 3D-rom. Mer her: PVector tutorial.

det virkelige arbeidet i dette eksemplet kommer imidlertid ikke fra meg i det hele tatt. De rå dybdeverdiene fra kinect er ikke direkte proporsjonale med fysisk dybde. Snarere skalerer de med den inverse av dybden i henhold til denne formelen:

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

I Stedet for å gjøre denne beregningen hele tiden, kan vi beregne alle disse verdiene i en oppslagstabell siden det bare er 2048 dybdeverdier.

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

Takk Til Matthew Fisher for formelen ovenfor. (Merk: for at resultatene skal være mer nøyaktige, må du kalibrere din spesifikke kinect-enhet, men formelen er nær nok for meg, så jeg holder meg til den for nå. Mer om kalibrering i et øyeblikk.)

Til Slutt kan vi trekke noen poeng basert på dybdeverdiene i meter:

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

Gjennomsnittlig Punktsporing

den virkelige magien til kinect ligger i datasynskapasiteten. Med dybdeinformasjon kan du gjøre alle slags morsomme ting som å si: «bakgrunnen er noe utover 5 fot . Ignorer det!»Uten dybde innebærer fjerning av bakgrunn alle slags omhyggelige piksel sammenligninger. Som en rask demonstrasjon av denne ideen, er her et veldig grunnleggende eksempel som beregner gjennomsnittlig xy-plassering av noen piksler foran en gitt dybdegrense.

Kilde for v1: AveragePointTracking

Kilde for v2: AveragePointTracking2

i dette eksemplet erklærer jeg to variabler for å legge opp alle de riktige x – og y – ene og en variabel for å holde oversikt over hvor mange det er.

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

Så, når vi finner et gitt punkt som overholder terskelen vår, legger jeg til x og y til summen:

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

når vi er ferdige, beregner vi gjennomsnittet og trekker et poeng!

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

hva mangler?

  • Alt spores via github-problemer.

FAQ

  1. Hva er det skygger i dybdebildet (v1)? Kinect Skyggediagram
  2. hva er dybden som kinect kan se ? (v1) ~0,7–6 meter eller 2,3–20 fot. Du får svarte piksler (eller rå dybdeverdi på 2048) på begge elementene som er for langt unna og for nært.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.