Over a weekend back in August I wrote a C++ program that allows people to draw graffiti on any surface. The person draws using a normal red laser pointer, and a MiniDV camera then detects the red dot. The C++ program maps the laser dot from camera coordinates into OpenGL screen coordinates using a simple homography. The computer projects its screen image back onto the surface, offering a persistent view of what the user has drawn.
The system is self-calibrating on startup–it uses four green squares to generate the homography. They disappear once calibration is complete. We then use OpenGL textures to render a chalk-like pen, following the laser pointer when it’s turned on. The system can also detect crude gestures to change ink color or clear the screen.
Using a typical VGA projector, we filled the side of a seven story building at night. Above are some pictures of things we drew. Because the system recognized gestures, we could easily draw using the laser pointer from a few blocks away from the actual equipment. We used a Panasonic MiniDV camcorder connected through firewire to a Intel Core2 2.4GHz box running Gentoo Linux. The computer was connected to an Epson 2400-lumens projector through a VGA cable and pointed towards the building.
Future work includes moving to an ffmpeg-based image processing solution, instead of using pipes to pass raw image data. Gestures need work so they are detected more reliably. Some effort should also be put into the laser pointer detection, as its thresholds can vary widely under different lighting conditions.