WPF en CamSpace, een leuke combinatie

Zo, de vakantie van 2008 is weer voorbij. In het Tatra gebergte is geen enkele
mogelijkheid voor een online verbinding en dat had best nog even mogen zo duren maar op een gegeven moment gaat het toch weer kriebelen.

De vakantieperiode is een uitgelezen moment om eens wat anders te onderzoeken dan wat je de rest van het bij de klant tegenkomt. De waan van de dag, zeg maar.
Zo kwam ik enige tijd geleden een demo tegen van een startup welke d.m.v.
beeldherkenning de gebruiker applicatie kon laten besturen. Dit zou met een
doodnormale webcam kunnen en daardoor kon ieder glimmend voorwerk een soort van Wii controller worden.

http://www.youtube.com/watch?v=v0srY37kkMw

Tijdens mijn vakantie kreeg ik de uitnodiging voor het beta traject dus de
afgelopen week ben ik er eens ingedoken.

Het is echt knap gemaakt, het werkt!

Met mijn Trust webcam van 14,95 en met vier fps (‘savonds bij kunstlicht)
blijkt het opeens mogelijk om een virtuele xylofoon te besturen met twee
markers. Wat ze doen is via een agent de webcam input omzetten naar een virtuele muis, joystick of toetsenbord. Het ondersteunt zelfs multi point input en er zijn veel variabelen in te stellen. Deze instellingen kunnen dan aan een
executable gehangen worden waardoor tijdens het opstarten van die executable, de input doorgegeven wordt.

Het was even zoeken maar er zat ook een SDK bij. Hiermee kunnen ontwikkelaars de huidige telemetrie uitlezen en de CamSpace host applicatie enigzins manipuleren. Helaas is er geen handleiding en ook de wiki is vooral leeg, maar het is redelijk zelfbeschrijvend. Helaas werkt het ontvangen van de input niet via callbackfunctionaliteit, ik moet hiervoor met een Timer werken. Aan de andere kant, we krijgen maar maximaal zo’n dertig keer per seconde gegevens door (ik dus maar vier keer onder slechte omstandigheiden) dus die timer werkt prima.

En zoals gezegd, het werkt als een fluitje en de waarden komen meestal door
als relatieve waarden voor hwet gemak. Zo geeft CamSpace door dat b.v. de X
waarde van een coordinaat op een derde van de breedte van het scherm staat.

Ik heb er eerst een met een WinForm applicatie tegenaan geprogrammeerd, maar helaas, daar zijn buttons niet te draaien. Dit gaf mij dus eindelijk een reden
om eens echt met WPF aan de gang te gaan. Ik had het in het verleden al wel eens vluchtig bekeken maar dit is dan toch weer in het diepe stappen.

Ik maakte eerst de fout om de verkeerde Timer te kiezen (system.Timers.Timer)
want die draait los van de UI thread. Dus zelfs het uitlezen van this.Width
werkte niet. Pas na de keuze voor de System.Windows.Threading.DispatcherTimer
begon het lopen en bleek ook de binding toch nog mee te vallen.

Zie hier het huidige resultaat van een paar avondjes knutselen:

Een beetje subtiel, maar CamSpace geeft ook de breedte door (dichtbij/veraf)
en die kan mooi in een smallere of bredere knop vertaald worden.

Wat nog fraaier was, bleek bij het uitzoeken van de rotatie. Dit was even
zoeken, maar die werden in radialen doorgegeven. En het mooie is dat CamSpace echt onthoudt hoeveel keer het ‘input device’ geroteerd is. Na vijf slagen linksom, kan je ook weer aftellen naar vijf slagen rechtsom. De simulatie van een schroevendraaier is daarbij dus een stuk dichterbij gekomen 😉

En hiermee komen we dus direct bij de conclusie: leuk stukje speelgoed, maar
wat kan je er mee. Datzelfde was ook de reactie op de eerste berichten over de
Wii controller…