Začínáme s Kinectem a zpracováním

snímač Microsoft Kinect je periferní zařízení (určené pro počítače XBox a windows), které funguje podobně jako webová kamera. Kromě poskytování obrazu RGB však poskytuje také hloubkovou mapu. Význam pro každý pixel viděný senzorem, Kinect měří vzdálenost od senzoru. Díky tomu je řada problémů s počítačovým viděním, jako je odstranění pozadí, detekce blobů a snadnější a zábavnější!

samotný snímač Kinect měří pouze barvu a hloubku. Jakmile je však tato informace ve vašem počítači, lze toho udělat mnohem více, jako je sledování“ kostry “ (tj. detekce modelu osoby a sledování jejích pohybů). Chcete-li sledování kostry budete muset použít Thomas Lengling je windows-only Kinect v2 zpracování libray. Pokud jste však na počítači Mac a vše, co chcete, jsou surová data z Kinectu, máte štěstí! Tato knihovna používá ovladače libfreenect a libfreenect2 open source pro přístup k těmto datům pro Mac OS X (Podpora systému windows již brzy).

jaký hardware potřebuji?

nejprve potřebujete“ samostatný “ kinect. Nemusíte kupovat Xbox.

  • samostatný snímač Kinect v1. Věřím, že tento je dodáván s napájecím zdrojem, takže nepotřebujete samostatný adaptér uvedený dále. Pokud však máte kinect v1 dodaný s Xboxem, nebude obsahovat napájení senzoru Kinect.
  • samostatný snímač Kinect v2. Pravděpodobně také potřebujete adaptér Kinect pro Windows. Nenechte se vyhodit, ačkoli to říká windows, To vám umožní připojit k počítači mac přes USB. Nakonec se také budete chtít ujistit, že váš počítač podporuje USB 3. Většina moderních strojů Ano, ale pokud si nejste jisti, můžete se dozvědět více zde pro Mac OS X.

některé další poznámky o různých modelech:

  • Kinect 1414: toto je původní kinect a pracuje s knihovnou zdokumentovanou na této stránce v sérii zpracování 3.0 beta.
  • Kinect 1473: vypadá to identicky s modelem 1414, ale jedná se o aktualizovaný model. Mělo by to fungovat s touto knihovnou, ale nemám žádnou na testování. Prosím, dejte mi vědět, jestli to dělá, nebo ne!
  • Kinect pro Windows verze 1: ???? Pomoc? Funguje tohle?
  • Kinect pro Windows verze 2: Jedná se o zbrusu nový kinect se všemi funkcemi nalezenými v XBox One Kinect. Také pracuje s touto knihovnou!

SimpleOpenNI

můžete také zvážit použití knihovny SimpleOpenNI a přečíst si knihu Grega Borensteina Making Things See. OpenNI má funkce (sledování kostry, rozpoznávání gest atd.), které nejsou k dispozici v této knihovně. Bohužel, OpenNI byl nedávno zakoupen společností Apple a, zatímco jsem si myslel, že byl zavřený, zdá se, že existuje nějaké úsilí o jeho oživení!. Není jasné, jaká bude budoucnost OpenNI a SimpleOpenNI.

jsem připraven začít právě teď

nejjednodušší způsob, jak nainstalovat knihovnu, je náčrt Správce příspěvků pro zpracování → importovat knihovny → Přidat knihovnu a vyhledat „Kinect“. Zobrazí se tlačítko označené „instalovat“.Chcete-li jej nainstalovat ručně, stáhněte nejnovější verzi a rozbalte ji do složky knihovny. Restartujte zpracování, otevřete jeden z příkladů ve složce příklady a je dobré jít!

co je zpracování?

zpracování je open source programovací jazyk a prostředí pro lidi, kteří chtějí vytvářet obrázky, animace a interakce. Původně vyvinutý sloužit jako softwarový skicář a učit základy počítačového programování ve vizuálním kontextu, zpracování také vyvinul do nástroje pro generování hotové profesionální práci. Dnes, existují desítky tisíc studentů, umělci, designéři, vědci, a fandové, kteří používají zpracování pro učení, prototypování, a výroba.

co když nechci používat zpracování?

pokud jste spokojeni s c++ doporučuji zvážit použití openFrameworks nebo Cinder s Kinect. Tato prostředí mají některé další funkce a můžete také získat výhodu rychlosti C++ při zpracování hloubkových dat atd.:

  • ofxKinect
  • Kinect CinderBlock
  • více zdrojů z: projektu OpenKinect

jaký kód mám napsat?

první věcí je zahrnout správné příkazy importu do horní části kódu:

import org.openkinect.processing.*;

stejně jako odkaz na objekt Kinect, tj.

Kinect kinect;

pak v setup() můžete inicializovat tento objekt kinect:

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

pokud používáte Kinect v2, použijte místo toho objekt Kinect2.

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

jakmile to uděláte, můžete začít přistupovat k datům ze senzoru kinect. V současné době vám knihovna zpřístupňuje data pěti způsoby:

  • PImage (RGB) z videokamery kinect.
  • PImage (grayscale) z IR kamery kinect.
  • PImage (grayscale) s jasem každého pixelu mapovaným do hloubky (jasnější = blíže).
  • PImage (RGB) s odstínem každého pixelu mapovaným do hloubky.
  • int array se surovými hloubkovými daty (11 bitových čísel mezi 0 a 2048).

podívejme se na ně jeden po druhém. Pokud chcete Kinect používat stejně jako běžná stará Webová kamera, můžete přistupovat k obrazu videa jako kuplíř!

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

můžete jednoduše požádat o tento obrázek v draw(), pokud však můžete také použít videoEvent(), abyste věděli, kdy je nový obrázek k dispozici.

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

pokud chcete IR obrázek:

kinect.enableIR(true);

s kinect v1 nemůže získat obraz videa i IR obraz. Oba jsou předány zpět přes getVideoImage (), takže ten, který byl naposledy povolen, je ten, který dostanete. S Kinect v2 jsou však k dispozici jako samostatné metody:

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

Nyní, pokud chcete obrázek hloubky, můžete požádat o obrázek ve stupních šedi:

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

stejně jako nezpracovaná data hloubky:

int depth = kinect.getRawDepth();

pro kinect v1 se hodnoty hloubky raw pohybují mezi 0 a 2048, pro kinect v2 je rozsah mezi 0 a 4500.

pro obraz s barevnou hloubkou použijte kinect.enableColorDepth(true);. A stejně jako u obrazu videa, tam je hloubka událost můžete přistupovat v případě potřeby.

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

bohužel, b / c RGB kamera a IR kamera nejsou fyzicky umístěny na stejném místě, existuje problém se stereofonním viděním. Pixel XY na jednom obrázku není stejný XY na obrázku z kamery o palec doprava. Kinect v2 nabízí takzvaný „registrovaný“ obraz, který zarovná všechny hodnoty hloubky s RGB kamerou. K tomu lze přistupovat následovně:

PImage img = kinect2.getRegisteredImage()

konečně, pro kinect v1 (ale ne v2), můžete také upravit úhel kamery metodou setTilt().

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

takže tady to máte, zde jsou všechny užitečné funkce, které byste mohli potřebovat k použití knihovny kinect pro zpracování:

  • initDevice() — začněte vše (video, hloubka, IR)
  • activateDevice(int) – aktivujte konkrétní zařízení, pokud je připojeno více zařízení
  • initVideo() — spustit pouze video
  • enableIR(boolean) — zapnutí nebo vypnutí obrazu IR kamery (pouze v1)
  • initDepth() — pouze hloubka spuštění
  • enableColorDepth(boolean) — zapněte nebo vypněte hodnoty hloubky jako barevný obrázek
  • enableMirror(boolean) — zrcadlit obraz a hloubka dat (v1 pouze)
  • PImage getVideoImage() — uchopte obraz videa RGB (nebo IR Pro v1)
  • PImage getIrImage() — uchopte IR obrázek (pouze v2)
  • PImage getDepthImage() — Chyť mapu hloubky obrázek
  • PImage getRegisteredImage() — uchopte obrázek registrované hloubky (pouze v2)
  • int getRawDepth() — Chyť nezpracovaná data hloubky
  • float getTilt() — Získejte aktuální úhel snímače (mezi 0 a 30 stupni) (pouze v1)
  • setTilt(float) — nastavte úhel snímače (mezi 0 a 30 stupni) (pouze v1)

pro všechno ostatní se můžete také podívat na odkaz javadoc.

příklady

existují čtyři základní příklady Pro v1 i v2.

zobrazení RGB, IR a hloubkových obrázků

kód Pro v1: RGBDepthTest

kód Pro v2:RGBDepthTest2

tento příklad používá všechny výše uvedené funkce k zobrazení dat ze senzoru kinect.

více zařízení

oba v1 a v2 má více podporu kinect.

kód Pro v1: MultiKinect

kód Pro v2:MultiKinect2

Point Cloud

kód Pro v1: PointCloud

kód Pro v2: Pointcloud

zde děláme něco trochu milovníka. Za prvé, využíváme 3D možnosti zpracování, abychom nakreslili body ve vesmíru. Budete se chtít seznámit s translate(), rotate(), pushMatrix(), popMatrix(). Tento tutoriál je také dobrým místem pro začátek. Příklad navíc používá Pvektor k popisu bodu ve 3D prostoru. Více zde: výukový program PVector.

skutečná práce tohoto příkladu však vůbec nepochází ode mě. Hodnoty surové hloubky z Kinectu nejsou přímo úměrné fyzické hloubce. Spíše se měří s inverzní hloubkou podle tohoto vzorce:

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

spíše než tento výpočet po celou dobu, můžeme předpočítat všechny tyto hodnoty do vyhledávací tabulky, protože existují pouze hodnoty hloubky 2048.

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

díky Matthewovi Fisherovi za výše uvedený vzorec. (Poznámka: aby výsledky byly přesnější, budete muset kalibrovat konkrétní zařízení kinect, ale vzorec je pro mě dost blízko, takže se s ním zatím držím. Více o kalibraci za chvíli.)

nakonec můžeme nakreslit některé body na základě hodnot hloubky v metrech:

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

průměrné sledování bodů

skutečné kouzlo Kinectu spočívá v jeho schopnostech počítačového vidění. S hloubkovými informacemi, můžete dělat nejrůznější zábavné věci, jako je říct: „pozadí je něco jiného než 5 chodidla.“. Ignoruj to!“Bez hloubky zahrnuje odstranění pozadí nejrůznější pečlivé srovnání Pixelů. Jako rychlou ukázku této myšlenky, zde je velmi základní příklad, který vypočítává průměrnou polohu XY všech pixelů před daným prahem hloubky.

zdroj pro v1: AveragePointTracking

zdroj pro v2: AveragePointTracking2

v tomto příkladu deklaruji dvě proměnné, které sečtou všechny příslušné x a y a jednu proměnnou, abych sledoval, kolik jich je.

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

pak, kdykoli najdeme daný bod, který odpovídá naší prahové hodnotě, přidám x a y k součtu:

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

až skončíme, vypočítáme průměr a nakreslíme bod!

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

co chybí?

  • vše je sledováno prostřednictvím problémů github.

FAQ

  1. jaké jsou stíny v hloubkovém obrazu (v1)? Kinect stínový diagram
  2. jaký je rozsah hloubky, který kinect vidí? (v1) ~0,7-6 metrů nebo 2,3-20 stop. Všimněte si, že získáte černé pixely (nebo surovou hodnotu hloubky 2048) u obou prvků, které jsou příliš daleko a příliš blízko.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.