Interactieve graffiti met Processing, Kinect en Makey Makey.

Op 15/16 augustus wordt in Gemert alweer de 26e editie van het Zebra-festival gehouden. Het festivalterrein is het parkeerterrein van Theater de Eendracht. Aan mij de leuke uitdaging om op een van de vrije muren een graffiti te projecteren die reageert op bewegingen van het aanwezige publiek.

Het platform om dit te kunnen realiseren bestaat in mijn geval uit een Kinect voor “motion-tracking”, een laptop met “Processing” voor de beeldbewerking en voor de graffiti-generatie, een HD-beamer voor de projectie en een MakeyMakey voor de user-interface.

Over Kinect

De gebruikte Kinect is een sensor voor de Microsoft XBOX 360 game console waarmee spellen gespeeld worden met behulp van gesture (=lichaamsbeweging) herkenning. Een van de sensoren die de kinect hiervoor inzet is de 3D diepte sensor, een combinatie van een scanning IR-laser projector en een IR-camera. Hiermee kan de Kinect onder allerlei lichtomstandigheden een diepte-informatie-plaatje generen (640×480 pixels, 30fps, 11 bit resolutie), zie voorbeeldplaatje. Hoe witter de pixel, hoe korter de afstand tot de Kinect. De algoritmes voor het herkennen van gestures zijn niet geintegreerd in de Kinect, daarvoor dient eigen software ontwikkeld te worden, bijvoorbeeld mbv OpenNI.

Over OpenNI

OpenNI (opgericht in Nov 2010) had als doel om Natural user-Interfaces te certificeren en om de inter-operabiliteit te bevorderen. Daarvoor werd o.a. een open source library ontwikkeld en onderhouden waarmee relatief eenvoudig nieuwe toepassing ontwikkeld konden worden.

Een van de trekkers van deze industrie-organisatie was PrimeSense, de ontwikkelaar van de Microsoft Kinect 3D technologie. Na de acquisitie van PrimeSense door Apple werd de OpenNI website in April 2014 opgeheven. De overige industrie en enthousiaste OpenNI gebruikers hebben de source code en documentatie echter kort daarna gepubliceerd op een nieuwe website: structureIO. De OpenNI library wordt nog steeds onderhouden en is momenteel beschikbaar voor OSx, Windows, Linux en voor Android. Aan een iOS versie wordt momenteel hard gewerkt.

Voor het gebruik van OpenNI binnen Processing is een wrapper beschikbaar onder de naam Simple-OpenNI. Daarin worden helaas niet alle OpenNI functies ondersteund. Een deel van het motion-detection algoritme zal dus zelf nog in Processing moeten worden geïmplementeerd.

Over Processing

Processing is een open source programmeertaal en -omgeving voor het ontwikkelen van “audiovisuele en/of beeldende kunst”. Oorspronkelijk opgezet om beeldende kunstenaars bekend te maken met de mogelijkheden van IT en om IT-ers in aanraking te brengen met de schoonheid van beeldende kunst. Om die reden is de complexiteit bewust laag gehouden en is de programmeertaal rijkelijk voorzien van functies voor het genereren en manipuleren van dynamische 2D en 3D objecten. Processing draait op platformen zoals Windows, OSx en Linux.

In dit project is Processing gebruik om de videobeelden vanaf de Kinect in te lezen, om beweging te analyseren en detecteren (motion detection) en om beelden te genereren die dynamisch reageren op de motion detection informatie. De user-interface wordt gerealiseerd middels een MakeyMakey die keyboard commando’s verstuurd naar de processing software.

Motion detection

In mijn project heeft Motion Detection tot doel een handsfree alternatief te bieden voor de mouse(pad) functionaliteit van een computer. De Motion Detection functie levert dus X/Y-coördinaten op waarmee je het genereren van graffiti kunt gaan beïnvloeden. Vertrekpunt voor het Motion Detection algoritme is het diepte-informatie beeld zoals dat met de Kinect wordt ingelezen. Het ‘voorwerp’ dat zich het dichtst bij de Kinect sensor bevindt bepaalt de gezochte X/Y coördinaten. Dat punt wordt gevonden door in het beeld op zoek te gaan naar de pixel met de hoogste witwaarde, zie foto.

Deze benadering is een prima eerste stap, maar in de praktijk blijkt de diepte informatie teveel ruis te bevatten waardoor de X/Y coördinaat zich nogal springerig gedraagt. Filtering is dus gewenst.

Daarom passen we “Centre-of-Mass” filtering toe. Daarmee houden we behalve met de hoogste witwaarde-pixel ook rekening met pixels uit de directe omgeving en berekenen daarmee een soort van gewogen gemiddelde; per pixel vermenigvuldig je de grijswaarde met de pixelpositie, telt dat voor alle pixels bij elkaar op en deelt vervolgens dat totaal weer door de som van alle pixelwaardes, zie formule hiernaast. Hoe groter het gebied is dat je gebruikt, hoe stabieler de resulterende X/Y positie zal zijn (ten koste van extra rekentijd, maar da’s op een PC nauwelijks nog een issue).

De volgende stap is het vloeiend volgen van een beweging. Hoewel hier meerdere oplossingen denkbaar zijn blijkt een simpel ‘Moving Average Filter” al een prima resultaat op te leveren, eventueel met exponentiële coëfficiënten voor een snellere response.

Voor wie zelf wil experimenteren is de gebruikte Processing-code te downloaden. Naast het CM-filter en het MA-filter zijn nog wat andere spatial filters inbegrepen; een edge-detectie, noise, blur en een sharpening filter. Dit zijn nog wat (ongebruikte maar wel werkende) restanten uit eerdere experimenten, aangeboden “ter leering ende vermaeck”.

Graffiti generatie

Processing is een uitstekende ontwikkelomgeving om van scratch dynamische graphics te generen, de voorbeelden hieronder laten dat zien. Live zijn het uiteraard bewegende beelden waarbij de positie van de graphics de X/Y coordinaten van de muis of de Kinect met motion detection volgt.




Over Makey Makey

De MakeyMakey van Sparkfun is een Arduino Leonardo derivaat met een voorgeprogrammeerde functie. Het maakt gebruik van een ATMega32u4 microprocessor en ondersteunt daarmee het USB-HID protocol. Hierdoor het kan fungeren als een gewoon computer toetsenbord.

Maar in plaats van reguliere druktoetsen heeft de MakeyMakey hoog-ohmige ingangen waarmee touch-keys gemaakt kunnen worden. En daarmee kun je allerlei leuke Human Interfaces maken. Door iedere ingang bijvoorbeeld in een stuk fruit te prikken kun je je project laten besturen door een banaan aan te raken, of een sinaasappel, etc.

Over de beamer

De omstandigheden zijn niet ideaal voor gebruik van een beamer; het oppervlak waarop geprojecteerd moet worden is een stenen muur, het gewenste projectie-oppervlak is ca 3*6 meter (h*b), de afstand tussen de beamer en de muur is ca 10 meter en projectie gebeurt in de open lucht. Dat betekent dat er pas geprojecteerd kan worden na zonsondergang en dat de lichtopbrengst vanwege de grootte en de aard van het oppervlak mager zal zijn. Een beamer met een sterke lichtbron is dus gewenst, een hoge contrast ratio is in dit geval wat minder relevant. Voor dit project koos ik voor een beamer met een lichtopbrengst van 4500 lumen en een contrast ratio van 1:4000. Gelukkig zijn dergelijke projectoren op de Chinese markt nog redelijk betaalbaar. Eerste experimenten op locatie toonden aan dat de resulterende beeldkwaliteit zeer acceptabel is. We zien het eindresultaat dan ook met vertrouwen tegemoet :-).

Het eindresultaat