3D Laser Scanning

3D Scanning

Photographs are cool, but I think at one time or another most geeks will have thought about how great it would be to scan their subject in full 3D, enabling them to view it from any angle digitally. No? Well maybe it's just me... Anyway, I've been thinking about this for some time. Dense disparity from multiple views of the subject should be able to create a 3D model, but often correspondences are too hard to find between images. It's this correspondence problem which led me to think about using lasers (well, a laser pointer).

By shining a concentrated beam of light into the scene we can very easily locate the correspondence on the camera. Originally I was thinking of using a single camera and an offset spinning laser from which I could establish surface contours. Fortunately for me, my flat-mate Brenton has been working with a stereoscopic rig for his final year project, and we decided to team up to simplify everything significantly. In fact, using his existing code for finding the closest point of intersection (and thus a point in 3D space) given correspondences in the two calibrated cameras, it was only really an evening work for us to produce something pretty cool.

Scanning Hugsy

The first thing we attempted to scan was Hugsy, a soft toy penguin; he was very patient.

Actual Hugsy Wireframe Hugsy
Texture mapped Hugsy Wireframe Hugsy

Scanning Monkey

We also scanned Monkey, who unfortunately wasn't quite as patient as Hugsy. The first image is a real photo for reference, and the remainder are novel views.

Actual Monkey Wireframe Monkey
Texture mapped Monkey Wireframe Monkey

You'll notice that the scans aren't 100% accurate, and there are a couple of things that we know that we can improve and play with to get better results, but it turned out to be quite a successfull evening filler.

Some more Detail

By using the laser we reduce the correspondence problem to finding the most intense points in both images (we turned the lights off to help). We simply traced out the object with the laser pointer by hand, trying to cover as much area as possible, logging the 2D points which we could use for texture mapping, and the 3D intersection point. From this we obtained a point cloud which we dumped into a VTK compatible file. From here on it was VTK scripting to create a surface mesh from the point cloud, extract the normals, texture map and render. This is a lot easier than it may sound using the VTK pipeline; I can highly recommend it. It is a little difficult to get started because the documentation isn't great, but fortunately we'd both only recently had a coursework where we had to learn how to use it.

Isn't scanning by hand a little uncouth?

Yes, it is; we got right on creating a mechanical laser scanner, well, I was the ideas man, Brenton actually did the making - he owns the LEGO and is much better at it than me.

We ended up with a LEGO contraption which scanned the laser in a raster fashion using a motor that oscillated left and right, all being winched back by a second motor for vertical motion. A photo of the rig and attached scanner is shown below.

The Scanning Rig

Despite the ingenuity of the mechanic LEGO laser scanner, it didn't produce great results. Scanning by hand allows you to cover complicated areas in more detail, and the scanner was just moving too fast.


by Steven Lovegrove and Brenton Bailey Jump to top