Kom godt i gang med Kinect og Processing

Microsoft Kinect-sensoren er en perifer enhed, der fungerer meget som et kamera. Ud over at give et RGB-billede giver det dog også et dybdekort. Betydning for hvert punkt, der ses af sensoren, måler Kinect afstanden fra sensoren. Dette gør en række computer vision problemer som baggrund fjernelse, blob afsløring, og mere nemt og sjovt!

Kinect-sensoren måler kun farve og dybde. Men når disse oplysninger er på din computer, kan meget mere gøres som “skelet” sporing (dvs.opdage en model af en person og spore hans/hendes bevægelser). For at gøre skelet sporing skal du bruge Thomas Lengling vinduer-kun Kinect v2 behandling libray. Men hvis du er på en Mac, og alt hvad du ønsker er rådata fra Kinect, er du heldig! Dette bibliotek bruger libfreenect og libfreenect2 open source drivere til at få adgang til disse data til Mac OS.

hvilket udstyr har jeg brug for?

først skal du have en “stand-alone” kinect. Du behøver ikke købe en kasse.

  • Standalone Kinect Sensor v1. Jeg tror, at denne leveres med strømforsyningen, så du ikke har brug for en separat adapter, der er anført næste. Men hvis du har en kinect v1, der fulgte med en kasse, inkluderer den ikke Kinect-sensorens strømforsyning.
  • Standalone Kinect Sensor v2. Du har sandsynligvis også brug for Kinect-adapteren til vinduer. Bliv ikke smidt af, selvom det står vinduer, dette giver dig mulighed for at forbinde den til din mac via USB. Endelig vil du også sørge for, at din computer understøtter USB 3. De fleste moderne maskiner gør det, men hvis du er usikker, kan du finde ud af mere her til Mac OS.

nogle yderligere noter om forskellige modeller:

  • Kinect 1414: dette er den oprindelige kinect og arbejder med biblioteket dokumenteret på denne side i Processing 3.0 beta-serien.
  • Kinect 1473: dette ser identisk ud med 1414, men er en opdateret model. Det skal fungere med dette bibliotek, men jeg har ikke en til at teste. Lad mig vide, om det gør eller ikke!
  • Kinect til vinduer version 1:???? Hjælp? Virker den her?
  • Kinect til vinduer version 2: Dette er den helt spanking nye kinect med alle de funktioner, der findes i boksen One Kinect. Arbejder også med dette bibliotek!

SimpleOpenNI

du kan også overveje at bruge SimpleOpenNI-biblioteket og læse Greg Borensteins Making Things see-bog. OpenNI har funktioner (skeletsporing, gestusgenkendelse osv.), der ikke er tilgængelige i dette bibliotek. Uheldigvis, OpenNI blev for nylig købt af Apple, og, mens jeg troede, det var lukket, dernede ser ud til at være nogle bestræbelser på at genoplive det!. Det er uklart, hvad fremtiden vil være for Openni og SimpleOpenNI.

jeg er klar til at komme i gang lige nu

den nemmeste måde at installere biblioteket på er med Processing Contributions Manager Sketch Purpur import Libraries Purpur Add library og søg efter “Kinect”. En knap vises mærket”installer”.Hvis du vil installere den manuelt, skal du hente den seneste udgivelse og udpakke den i mappen biblioteker. Genstart behandlingen, Åbn et af eksemplerne i mappen eksempler, og du er god til at gå!

Hvad er behandling?

behandling er et open source programmeringssprog og miljø for folk, der ønsker at skabe billeder, animationer og interaktioner. Oprindeligt udviklet til at tjene som et program skitsebog og til at undervise grundlæggende i computerprogrammering inden for en visuel kontekst, har behandling også udviklet sig til et værktøj til at generere færdigt professionelt arbejde. I dag er der titusinder af studerende, kunstnere, designere, forskere og hobbyister, der bruger behandling til læring, prototyping og produktion.

hvad hvis jeg ikke vil bruge behandling?

hvis du er fortrolig med C++, foreslår jeg, at du overvejer at bruge Openframe-værker eller Cinder med Kinect. Disse miljøer har nogle ekstra funktioner, og du kan også få en C++ – hastighedsfordel, når du behandler dybdedataene osv.:

  • Ofkskinect
  • Kinect CinderBlock
  • flere ressourcer fra: OpenKinect-projektet

hvilken kode skriver jeg?

første ting er at medtage de korrekte importopgørelser øverst i din kode:

import org.openkinect.processing.*;

samt en henvisning til et Kinect objekt, dvs.

Kinect kinect;

så i setup() kan du initialisere det kinect-objekt:

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

hvis du bruger en Kinect v2, skal du bruge et Kinect2-objekt i stedet.

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

når du har gjort dette, kan du begynde at få adgang til data fra kinect-sensoren. I øjeblikket gør biblioteket data tilgængelige for dig på fem måder:

  • PImage (RGB) fra kinect-videokameraet.
  • PImage (grayscale) fra kinect IR-kameraet.
  • PImage (grayscale) med hver billeds lysstyrke kortlagt til dybde (lysere = tættere).
  • PImage (RGB) med hver billedfarve kortlagt til dybde.
  • int array med rå dybdedata (11 bit tal mellem 0 og 2048).

lad os se på disse en ad gangen. Hvis du vil bruge Kinect ligesom et almindeligt gammelt kamera, kan du få adgang til videobilledet som en PImage!

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

du kan blot bede om dette billede i draw(), men hvis du også kan bruge videoEvent() til at vide, hvornår et nyt billede er tilgængeligt.

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

hvis du vil have IR-billedet:

kinect.enableIR(true);

med kinect kan v1 ikke få både videobilledet og IR-billedet. De sendes begge tilbage via getVideoImage (), så den, der senest blev aktiveret, er den, du får. Men med Kinect v2 er de begge tilgængelige som separate metoder:

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

nu, hvis du vil have dybdebilledet, kan du anmode om gråtonebilledet:

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

samt de rå dybdedata:

int depth = kinect.getRawDepth();

for kinect v1 ligger de rå dybdeværdier mellem 0 og 2048, for kinect v2 er området mellem 0 og 4500.

for farvedybdebilledet skal du bruge kinect.enableColorDepth(true);. Og ligesom med videobilledet er der en dybdebegivenhed, du kan få adgang til, hvis det er nødvendigt.

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

Desværre er b / c RGB-kameraet og IR-kameraet ikke fysisk placeret på samme sted, der er et stereosynsproblem. Et billede er ikke det samme i et billede fra et kamera en tomme til højre. Kinect v2 tilbyder det, der kaldes et “registreret” billede, der justerer alle dybdeværdierne med RGB-kameraet. Dette kan tilgås som følger:

PImage img = kinect2.getRegisteredImage()

endelig kan du for kinect v1 (men ikke v2) også justere kameravinklen med setTilt() – metoden.

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

så der har du det, her er alle de nyttige funktioner, du muligvis har brug for for at bruge Processing kinect-biblioteket:

  • initDevice() — start alt (video, dybde, IR)
  • activateDevice(int) – aktiver en bestemt enhed, når flere enheder er tilsluttet
  • initVideo() — start kun video
  • enableIR(boolean) — Tænd eller sluk for IR-kamerabilledet (kun v1)
  • initDepth() — start dybde kun
  • enableColorDepth(boolean) — Tænd eller sluk for dybdeværdierne som farvebillede
  • enableMirror(boolean) — spejle billed-og dybdedata (kun v1)
  • PImage getVideoImage() — Grib RGB (eller IR til v1) videobillede
  • PImage getIrImage() — Grib IR-billedet (kun v2)
  • PImage getDepthImage() — Grib dybdekortet billede
  • PImage getRegisteredImage() — Grib det registrerede dybdebillede (kun v2)
  • int getRawDepth() — Grib de rå dybdedata
  • float getTilt() — få den aktuelle sensorvinkel (mellem 0 og 30 grader) (kun v1)
  • setTilt(float) — juster sensorvinklen (mellem 0 og 30 grader) (kun v1)

For alt andet kan du også se på javadoc-referencen.

eksempler

der er fire grundlæggende eksempler for både v1 og v2.

Vis RGB -, IR-og Dybdebilleder

kode til v1: Rgbdybdetest

kode til v2:RGBDepthTest2

dette eksempel bruger alle ovennævnte funktioner til at vise dataene fra kinect-sensoren.

flere enheder

både v1 og v2 har flere kinect support.

kode til v1:MultiKinect

kode til v2:MultiKinect2

Point Cloud

kode til v1: PointCloud

kode til V2: PointCloud

her laver vi noget lidt mere avanceret. Nummer et, vi bruger 3D-funktionerne til behandling til at tegne punkter i rummet. Du vil gerne gøre dig bekendt med translate(), Roter(), pushmatriks(), popmatriks(). Denne tutorial er også et godt sted at starte. Derudover bruger eksemplet En Pvektor til at beskrive et punkt i 3D-rum. Mere her: PVector tutorial.

det virkelige arbejde i dette eksempel kommer dog slet ikke fra mig. De rå dybdeværdier fra kinect er ikke direkte proportional med den fysiske dybde. Snarere skalerer de med det inverse af dybden i henhold til denne formel:

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

i stedet for at gøre denne beregning hele tiden, kan vi forudberegne alle disse værdier i en opslagstabel, da der kun er 2048 dybdeværdier.

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

tak til Mattæus Fisher for ovenstående formel. (Bemærk: For at resultaterne skal være mere præcise, skal du kalibrere din specifikke kinect-enhed, men formlen er tæt nok for mig, så jeg holder fast i det for nu. Mere om kalibrering på et øjeblik.)

endelig kan vi tegne nogle punkter baseret på dybdeværdierne 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(); } }

gennemsnitlig Punktsporing

kinect ‘ s virkelige magi ligger i dens computervisionsfunktioner. Med dybdeinformation kan du gøre alle mulige sjove ting som at sige: “baggrunden er noget ud over 5 fod. Ignorer det!”Uden dybde involverer fjernelse af baggrund alle mulige omhyggelige sammenligninger. Som en hurtig demonstration af denne ide er her et meget grundlæggende eksempel, der beregner den gennemsnitlige placering af eventuelle billedpunkter foran en given dybdegrænse.

kilde til v1: AveragePointTracking

kilde til v2: AveragePointTracking2

i dette eksempel erklærer jeg to variabler for at tilføje alle de relevante K ‘er og y’ er og en variabel for at holde styr på, hvor mange der er.

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

derefter, når vi finder et givet punkt, der overholder vores tærskel, tilføjer jeg H og y til summen:

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

når vi er færdige, beregner vi gennemsnittet og tegner et punkt!

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

hvad mangler?

  • alt bliver sporet via github spørgsmål.

ofte stillede spørgsmål

  1. Hvad er der skygger i dybdebilledet (v1)? Kinect Skyggediagram
  2. Hvad er dybdeområdet, som kinect kan se? (v1) ~0,7–6 meter eller 2,3–20 fod. Bemærk Du får sorte billedpunkter (eller rå dybdeværdi på 2048) på begge elementer, der er for langt væk og for tæt.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.