Quatre machines te jugent, quatre étiquettes en témoignent. Colle-les dans ton passeport : aucune douane ne l’acceptera. Mais toi, tu sauras enfin qui tu es (à peu près).
Il y a quelques mois, on m’a posé une question simple : « Tu saurais bricoler des trucs interactifs pour la BIP ? » J’ai dit oui. Évidemment…
Résultat : quatre installations pour Miroir Miroir, l’exposition de la Biennale de l’Image Possible 2026, à Liège, du 17 octobre au 13 décembre. Quatre bornes avec écran tactile, des caméras cachées un peu partout, une Kinect (2010) sortie du placard et quatre imprimantes d’étiquettes. Le tout est développé au Liège Hackerspace.
Le principe est le même partout : vous participez, la machine vous « regarde juge », et vous repartez avec une étiquette à coller dans votre passeport de visite. Un miroir, mais imprimé.
Note : cet article est le « making-of technique », brut de décoffrage. Les photos et les captures montrent le projet à nu, sans habillage scénographique. Une page dédiée arrivera bientôt sur /art : elle présentera les installations telles qu’elles sont montées dans l’exposition, avec leur mise en scène.
Le socle commun
Les quatre bornes ont le même squelette. Chacune fait tourner une app web statique dans Chromium en mode kiosk, sur un écran tactile Elo en 1024×768, avec une scène fixe mise à l’échelle. Pas de framework, pas de build : du HTML, du CSS et du JS, point.
- Autorun : à l’ouverture de session,
kiosk.shlance Chromium en--kiosk, et une boucle le relance s’il plante. Parce que oui, il plantera. - Impression silencieuse : un petit service Python (
print_server.py) reçoit l’étiquette, la passe en PDF et l’envoie à CUPS. Pas d’aperçu à l’écran, pas de boîte de dialogue. - Imprimante : une LW650XL PRO qui parle TSPL, avec son pilote CUPS. Les étiquettes font 59×102 mm.
- Bandeau « petite pause technique » sur l’accueil, dès qu’une imprimante, une caméra ou la Kinect ne répond plus.
- Une vue de réglage cachée donne accès au debug, au redémarrage et à l’extinction propres.

01. Le vrai test psychométrique
Le plus sage des quatre. Il tourne sur un Raspberry Pi 4 : huit questions et un résultat tiré parmi quatre, imprimé sur l’étiquette. Le contenu est rédigé dans un tableur Excel, et un script Python (build_content.py) le transforme en content.js. Les correcteurs n’ont jamais à toucher au code.
02. Des yeux derrière la tête
Le visiteur appuie sur « Prendre une photo ». Quatre caméras IP Tapo C110, cachées dans la pièce, déclenchent toutes en même temps.
Le piège : ces caméras n’ont pas d’URL de snapshot, seulement un flux RTSP. Et, un navigateur ne lit pas du RTSP, surtout derrière un mot de passe (bonjour CORS). La solution est un petit server.py qui sert l’app et relaie /snap/1…4 : à chaque appel, ffmpeg extrait une image du flux. Une caméra injoignable est simplement ignorée, et la borne affiche discrètement la panne.

03. Vide ton sac
Un vrai faux contrôle de sûreté d’aéroport. Le visiteur vide ses poches dans un bac et le glisse sous le scanner. L’écran affiche le contenu en « rayons X » et la borne imprime une étiquette AUTORISÉ.
La V1 utilisait un capteur GPIO et une Pi Camera sur un Raspberry Pi 4. La version finale tourne sur un mini PC avec une webcam USB fixée au-dessus du bac, et OpenCV qui :
- repère le bac grâce à sa bordure orange,
- attend que le bac entier soit visible et que plus rien ne bouge dedans pendant 1,5 s,
- recadre la photo sur l’intérieur du bac,
- garde une empreinte du contenu pour ne pas scanner deux fois le même bac.
Bonus : les néons faisaient défiler des bandes sombres sur l’image, donnant des faux positifs. Solution : passer la webcam en anti-scintillement 50 Hz.

04. Re-Kinect-Toi
Retour aux vieilles recettes : une Kinect de 2010, bricolée pour son alimentation.
Le visiteur se place sur une croix au sol, 3, 2, 1, puis il a 10 secondes pour bouger. Ses mains, ses pieds et sa tête tracent une signature à l’encre : trait épais quand le geste est lent, fin quand il est rapide.
Kinect v1 → USB → kinect_bridge.py → WebSocket → Page kiosk- Matériel : une Kinect Xbox 360 (bricolée avec un adaptateur secteur 12 V) sur un mini PC Core i5.
- Pilote : libfreenect. Il faut blacklister
gspca_kinect, le pilote webcam du noyau, qui lui pique le périphérique. - Squelette : MediaPipe Pose sur la caméra couleur. La profondeur sert à mesurer la distance et à isoler la personne du décor, qu’on « apprend » une fois la salle vide.
- Repli : sans squelette, le pont devine la tête, les mains et les pieds à partir de la silhouette en profondeur. Ça marche même dans le noir.


Un dernier mot honnête

Pour être franc, sur ce projet, j’étais seul, avec quatre bornes à livrer et des deadlines qui ne se négociaient pas. Alors, je me suis laissé emporter par la vibe… avec Claude comme binôme. Le pont Kinect, le relais RTSP, la détection du bac en OpenCV, le pilote d’imprimante TSPL… Seul, je n’aurais jamais bouclé tout ça dans les temps.
Et le plus surprenant, c’est que j’ai appris beaucoup de petites choses en route : libfreenect, MediaPipe, les caprices du 50 Hz, des finesses CUPS… Le code n’est pas parfait, mais il tourne bien, il est documenté, et je sais ce qu’il fait.
L’IA n’a pas fait le projet à ma place. Elle m’a permis de le faire tout court.
Tout le code est sur GitHub : iooner/bip2026-modules.











