I was reading about QR codes lately. They fascinate me somehow; just like mazes and fractals, they have this esoterical yet recognizable form, but unlike them, they can be much, much more: they store content. Finding QR encoders is easy enough (PhpQrCode works very well). Since the specs are open (although a thorough explanation of the math behind it goes beyond my comprehension), I guess its easy to implement. The real problem must be in the decoding procedure. Since QR codes were meant to be decoded in warehouses using hand-held scanners, physical hurdles like dirt and image quality must be a nightmare to handle. I found this library called ZXing that gives an impressive array of features. Written essentially for handhelds, there’s also a C++ port. Once compiled, the default application does the job of reading QR codes in all image formats.
Now the real fun begins: In the xkcd book (volume 0), there are 5 QR codes located on the left side of page 100012 (you did notice that it uses a base 3 paging count, did you ?). I scanned the page and ran it each QR code through the ZXing. The results ? Well, let’s just say that Randall is a fan of Mario Cart on the Wii and he’s being the nice guy he always seems to be. 😉
My next test was really interesting: I have an ash grey T-Shirt with a QR code on the back in crimson color, measuring 3 x 3 inches. You can guess this was going to be a little more challenging. Since I don’t have a handheld device, I merely used the camera on my iPod nano to film it and extracted each frame with MPlayer on my PC. The first films I took were short with awful results, so I decided to take a longer film, zooming in and out, and tilting the camera to minimize the skewing and warping of the images. This time, I got 106 hits out of 1066 frames, a 10% hit rate which is very good considering that I was randomly moving my camera. No doubt with a real handheld, I would have gotten more precise hits.