# Structured Light 3D Scanning

The same technique used for Thom's face in the Radiohead "House of Cards" video. I'll walk you through setting up your projector and camera, and capturing images that can be decoded into a 3D point cloud using a Processing application.

House of Cards Google Code project

I've included a lot of discussion about how to make this technique work, and the general theory behind it. The basic idea is:

2 Rotate a projector clockwise to "portrait"
3 Project the included images in /patterns, taking a picture of each
4 Resize the photos and replace the example images in /img with them
Remove these ads by Signing Up

## Step 1: Theory: Triangulation

If you just want to make a scan and don't care how it works, skip to Step 3! These first two steps are just some discussion of the technique.

Triangulation from Inherent Features
Most 3D scanning is based on triangulation (the exception being time-of-flight systems like Microsoft's "Natal"). Triangulation works on the basic trigonometric principle of taking three measurements of a triangle and using those to recover the remaining measurements.

If we take a picture of a small white ball from two perspectives, we will get two angle measurements (based on the position of the ball in the camera's images). If we also know the distance between the two cameras, we have two angles and a side. This allows us to calculate the distance to the white ball. This is how motion capture works (lots of reflective balls, lots of cameras). It is related to how humans see depth, and is used in disparity-based 3D scanning (for example, Point Grey's Bumblebee).

Triangulation from Projected Features
Instead of using multiple image sensors, we can replace one with a laser pointer. If we know the angle of the laser pointer, that's one angle. The other comes from the camera again, except we're looking for a laser dot instead of a white ball. The distance between the laser and camera gives us the side, and from this we can calculate the distance to the laser dot.

But cameras aren't limited to one point at a time, we could scan a whole line. This is the foundation of systems like the DAVID 3D Scanner, which sweep a line laser across the scene.

Or, better yet, we could project a bunch of lines and track them all simultaneously. This is called structured light scanning.
 1-40 of 215 Next »
yieldlymph1 month ago

I am also getting the error "Cannot find class or type named PriorityQueue"

Any ideas?

24 days ago

Yes. I have an idea.

http://www.meetup.com/LA-Computer-Vision-Lab/messa...

mentions that when "Processing" moved from v1 to v2, ThreePhase broke, and "Richard" of the above-named URL came up with a crowbar solution: cut out the controls entirely, by:

* renaming Controls.pde to Controls.pdeRENAMED

* moving its [four, public float] global variables over into ThreePhase.pde

* adding a line to top of PhaseUnwrap.pde:

"import java.util.PriorityQueue;" [so THAT's where the class or type is...]

For my part, I also:

* added this to the bottom of ThreePhase.pde's void setup() method, to automatically get a PLY mesh output (which I can view in meshlab for example):

"exportMesh = true;"

(under "update = true;")

* commented out the "if(takeScreenshot) {" in the same method because it seems to call the camera

* copied the (gone-missing from Controls.pde) "String getTimestamp() {" method from Controls.pde into Export.pde (because it complained when trying to create the export)

This is me using a meat hook on a crowbar--because I don't know bupkus about object-oriented programming or "processing" (what a name for something they knew in advance people were going to have to google)

Anyways, with this sort of bumbling, I was able to get past the errors and get a ply file (stored in the same dir with the PDEs).

[Idle thought: wonder what the output would look like taking the three "patterns" as the three "images": NULL image, right?]

Good luck. [and Thanks, Richard, over on meetup!]

24 days ago

BTW, meshlab showed a "phase error" in the result: the entire right shoulder is raised compared to the left.

davidbarcomb1 month ago

Very nice. Thanks

yieldlymph1 month ago

nice

OlegKitFace2 months ago

Updated for processing 2.X:

https://github.com/kippkitts/3PhaseScanning/tree/master/ThreePhase

ChrisH14 months ago

I am also getting the error "Cannot find class or type named PriorityQueue"

Any ideas?

3 months ago

Same issue (also with LinkedList in ThreePhase-1): I put:

import java.util.*;

In any source, but a new error appeared: java.lang.NullPointerException :/

paverphalange5 months ago

Can someone explain to me the point of using 5v and a regulator to get to 3.3v when there is a 3.3v supply from the pi. I am fairly new to this stuff and am just trying to learn. Thanks.

motherprune6 months ago

Thats cold

cobbledbeard6 months ago

Nicely done... Amazing instructable

mousepaper6 months ago

Tremendous...!!

satterfieldmartha6 months ago

awesome

satterfieldmartha6 months ago

Can someone explain to me the point of using 5v and a regulator to get to 3.3v when there is a 3.3v supply from the pi. I am fairly new to this stuff and am just trying to learn. Thanks.

Terrific...!!

amazedgreen6 months ago

Its wonderful

fastbobble6 months ago

Thats astounding

gorgeddamp6 months ago

Astonishing

Pustekuchen6 months ago

Hey Guys,

if I have just a "single-dot-laser" I can determine X, Y and Z in help of the Triangulation.

So Z is Z = (f*b*tan(alpha))/(f+x*tan(alpha))

where

f -focal length

b - Laser Camera Disance

alpha - Laser Angle

So I have a Problem there. I calculated x because I need it in mm. So I did the following:

x = (x_pixel/pizel_widh_Image-0.5)*SensorSizeX

But my measurement are wrong. I am sure the Formula for Z is right. But I am not sure about x. Is there some one who can help me?

clearedeager6 months ago

Its remarkable

illrings6 months ago

Its nice

airbugger7 months ago

Its extraordinary

williamsjavellana7 months ago

Its exceptional :)

nice

tealrink7 months ago

TOO GOOD

grousebandit7 months ago

Awe-inspiring

harechubby7 months ago

great

jiffymanager7 months ago

great

jiffymanager7 months ago

super

calmlunch8 months ago

good

VitaminX8 months ago

Nicely done... Amazing instructable

clapfilk8 months ago

super

good

nitoloz8 months ago

Hi Kyle,thats really very interesting,but i have faced the same problem as Erlud before
the problrm is with PriorityQueue:
PriorityQueue toProcess; Processing cannot find a class or type named "PriorityQueue".

Can anyone help me?

spongeraffle8 months ago

Thats interesting

workexaminer8 months ago

Beneficial

Sebastian Morales9 months ago

I saw this first on Open Processing! I am glad I found how to do it, this is amazing! Thanks

clickyummy9 months ago

good

bearblue9 months ago

good

bearblue9 months ago

good

 1-40 of 215 Next »