Hexz, naar het begin

Artikelen · Experiment

Zien, de camera als pen

Wat ziet een computer als hij naar je kijkt? Minder dan je denkt, en toch genoeg om mee te tekenen.

Wat ik me afvroeg

Wat ziet een computer als hij naar je kijkt? En is dat genoeg om mee te tekenen?

Wat ik deed

Ik begon op mijn eigen computer, met OpenCV. Dat is de bekendste gereedschapskist voor beeldherkenning. Eerst in C++: een foto inlezen en grijs maken. Daarna in Python, met een bekend voorbeeld: houd een gekleurd voorwerp voor de camera, en de computer volgt die kleur en tekent ermee.

Dat werkt, maar je hebt er een voorwerp in precies de goede kleur voor nodig. Ik wilde weten of het ook met niets kan: alleen je hand, en alleen beweging.

Dat is wat je in het voorbeeld ziet. Het draait in je browser, in vier standen:

Hier gebruik ik geen OpenCV. De stappen zijn klein genoeg om met de hand te schrijven, en dan zie je ook wat er gebeurt.

Wat me verbaasde

De computer kijkt naar bijna niets

Het beeld van je camera is hier 640 bij 480 punten, in kleur. De computer maakt het eerst kleiner en grijs: 160 bij 120 punten, elk één getal. Dat zijn 19.200 getallen. Zestien keer zo weinig punten als het beeld dat jij ziet, en zonder kleur.

Kijk in de tweede stand hoe grof dat is. Toch herken je jezelf.

Bewegen is een verschil

De computer weet niet wat een hand is. Hij trekt het vorige beeld af van dit beeld. Waar het verschil groot genoeg is, beweegt iets. Meer is het niet.

Sta stil in de derde stand, en je verdwijnt. Je bent er nog, maar voor de computer besta je alleen zolang je verandert.

Eén punt is genoeg

Van alle punten die bewegen, neemt de computer het midden. Dat ene punt is de pen.

Het is een domme pen. Beweeg twee handen, en het punt zit er tussenin. Loopt er iemand achter je langs, dan tekent die mee. En toch voelt het als tekenen, zolang je de enige bent die beweegt.

Het licht doet mee

Een lamp die flikkert, een wolk voor de zon, een camera die zelf de helderheid bijstelt: dan verandert elk punt een beetje, en beweegt voor de computer alles.

Daarvoor is de schuif gevoeligheid. Hoe hoger het getal, hoe groter een verschil moet zijn voordat het telt. Te laag, en de ruis tekent mee. Te hoog, en je hand wordt niet meer gezien.

Snel genoeg is niet hetzelfde als snel

Het rekenwerk is het probleem niet. Kijk naar de teller: op mijn computer kost een beeld ongeveer een halve milliseconde.

Wat je wel voelt, is vertraging. Zet de schuif vertraging van de pen op 100 milliseconden, en daarna op 300. Het kruis blijft bij je hand, de lijn komt erachteraan. Ergens onderweg houdt het op een pen te zijn, en wordt het iets waar je op wacht.

Hoe het werkt

Dit is de stap die vindt wat er beweegt:

for (let y = 0, i = 0; y < PH; y++) {
  for (let x = 0; x < PW; x++, i++) {
    const changed = Math.abs(grey[i] - previous[i]) > threshold;
    moving[i] = changed ? 1 : 0;
    if (changed) {
      n++;
      sumX += x;
      sumY += y;
    }
  }
}

Voor elk punt: is het verschil met het vorige beeld groter dan de drempel? Dan telt het mee. Onderweg tel je op waar die punten liggen.

Deel je die som door het aantal, dan heb je het midden:

const x = sumX / n / PW;
const y = sumY / n / PH;

De lijn zelf is dezelfde als in Eén krabbel, tien talen: een rij van honderd punten, waarbij het nieuwste punt het oudste vervangt.

Het beeld blijft bij jou

De camera gaat pas aan als je erom vraagt. Alles wat je in het voorbeeld ziet, wordt in je eigen browser uitgerekend. Er gaat geen beeld naar een server, en er wordt niets bewaard. Ga je naar een ander onderwerp, sluit je de pagina of druk je op stop, dan gaat de camera uit.

Wil je geen camera gebruiken, dan doet een getekende hand hetzelfde.

De code

github.com/hexzmedia/exp-camera-pen

Gemaakt met hulp van AI. De code, het voorbeeld op deze pagina en de tekst zijn met een AI-assistent gemaakt. Het idee, de vragen en de keuzes zijn van mij.