3D visionExplainer

Align multiple 3D scans with photogrammetry targets

How photogrammetry targets align multiple 3D scans into one point cloud: how many each scan needs, how large they must be in pixels, and when they beat ICP.

LumaSpec Vision10 min read Share on LinkedIn

On this page 10 sections
  1. 01Why separate scans drift apart
  2. 02How target-based alignment works
  3. 03Target solve versus ICP best-fit
  4. 04Sizing coded targets for two 5 MP heads at 500 mm working distance
  5. 05Placing targets so every scan pair shares four
  6. 06Keeping the heads still
  7. 07Where the usual answer is wrong
  8. 08Checks before you order and run
  9. 09Choosing the hardware
  10. 10Questions

Scan a housing from three directions with a 3D sensor and you hold three point clouds, each accurate in millimetres but oriented to its own capture position. Merging them by eye leaves a seam error nobody can defend to a customer. Coded photogrammetry targets fix that: place the same labelled dots where every scan position can see them, capture, and let the software put every scan into one frame through known point correspondences.

This page explains how the method works, how large each dot must be for your sensor, how many targets each scan needs to share, and where it fails — with worked numbers for a typical 5 MP head at 500 mm working distance. It is for anyone merging scans from several positions or several heads on one part.

Why separate scans drift apart

A structured-light or stereo head returns points in millimetres, because its own calibration is metric. What the cloud does not carry is the pose of the head relative to the previous scan. Best-fit registration, usually iterative closest point (ICP), infers that pose by sliding one cloud onto the other. It works only when the scans share a large, textured overlap. On smooth, curved or repeating surfaces the solver slides freely: a cylinder accepts a rotation about its own axis at zero cost, so the fit can settle wrong by degrees.

Contrast three cases. Frames from one fixed camera already share a frame, so merging depth frames into one gap-free cloud needs no solve at all. Two heads bolted into one rig need a single extrinsic calibration, done once. Heads that move between captures — or three or more heads looking inward at one part — need correspondences the scene itself provides, and that is what the coded dots are. The same logic holds when fusing several depth cameras through calibrated extrinsics: the fusion is only as good as the pose you feed it.

How target-based alignment works

Each coded dot is a printed or stick-on marker whose ring pattern carries an identity. The workflow runs in five steps:

  1. Place 8 to 12 dots on or around the part so that most scan positions see most of them.
  2. Capture each scan as usual; the head's greyscale image shows the dots as crisp blobs.
  3. Software locates each blob centre to sub-pixel precision with a weighted centroid and decodes the ring to recover the identity.
  4. Every shared identity now has a 3D coordinate in each scan's own frame.
  5. The solver computes one rigid transform per scan into a master frame by least squares over the shared dots.

The transform is the rigid-body equation:

x' = R x + t

where x is a target coordinate in one scan, R a 3 x 3 rotation and t a translation. Three non-collinear targets define the transform; four or more give the least-squares solve redundancy, and spreading them over the part averages the noise down. No scale factor appears, because every scan already arrives in millimetres from its calibrated sensor. A scale bar matters only when you align photographs rather than sensor clouds.

How well a dot can be located sets the alignment floor, and that is a pixel-count question:

g = p × WD / f n = d / g

Here g is the object distance one pixel covers (mm/px), p the pixel pitch (mm), WD the working distance (mm), f the focal length (mm), d the dot diameter (mm) and n the pixels across a dot. Plan on n of at least 10 for reliable code decoding. A weighted centroid on a dot spanning dozens of pixels finds the centre to roughly 0.1 px, and that figure is what the final registration inherits.

Target solve versus ICP best-fit

Method Needs Strong on Weak on
Coded targets dots visible from each position 360° coverage, multi-head rigs, smooth parts dots must stay fixed; occlusion cuts redundancy
ICP best-fit textured overlap between scans polishing a target solve on shared surfaces slides on cylinders, spheres and repeating features
Fixed rig, one-time calibration heads that never move relative to each other high-volume repeat inspection cannot follow moved or hand-held positions

Use both where you can: targets set the global frame, then a local ICP pass over the shared overlap trims surface-level mismatch. Expect the finished seam to sit at or below the scan's own point spacing. If the head itself is still an open choice, the industrial 3D camera selection guide sorts stereo, ToF and structured light by task.

Sizing coded targets for two 5 MP heads at 500 mm working distance

The inputs: a typical 5 MP industrial sensor, 2448 x 2048 pixels with a 3.45 µm pitch, a 25 mm lens, and a 500 mm working distance. The pitch, focal length and distance are stated example values for a common head class; the 10 px floor and the 0.1 px centroid figure come from the detection section above. If the head position is not settled yet, set it first with the 3D camera working distance and positioning guide.

First the pixel scale:

g = p × WD / f = 0.00345 mm × 500 mm / 25 mm = 0.069 mm/px

Smallest dot that decodes: d = 10 px × 0.069 mm/px = 0.69 mm. Choose the far more common 6 mm coded dots: n = 6 / 0.069 ≈ 87 px across, nearly nine times the floor.

Margin across the positioning range: at 250 mm, g = 0.00345 × 250 / 25 = 0.0345 mm/px and a dot spans 174 px. At 1000 mm, g = 0.138 mm/px and it still spans 43 px. Registration noise per dot: 0.1 px × 0.069 mm/px ≈ 0.007 mm, against a lateral point spacing close to g, about 0.07 mm.

Decision: for a 5 MP head with a 25 mm lens, 6 mm coded dots cover working distances from about 250 mm to 1000 mm with margin on both ends. Closer than 250 mm they are simply over-sampled. Farther out, resize from the formula so n stays above 10.

Check your own numbers in the resolution calculator:

Camera resolution for the smallest feature
Units
Pixels needed
–
Sensor size
– MP
Smallest sensor that fits
–
Pixel on the part
– mm
Pixels across the feature, that sensor
–

Pixels needed = field / feature × pixels per feature on each axis (field incl. margin). The lens must resolve the pixels too: Nyquist = 1000 / (2 × pixel µm) lp/mm.

Find cameras with enough pixels Open the full calculator

A projected structured-light head in exactly this class:

3D sensorsHikrobot MV-DPS200P-02 Projected structured-light 3D cameraMV-DPS200P-02
Type
Stereo / structured light
$8,829.00 · quotedView and quote

Placing targets so every scan pair shares four

Three non-collinear shared dots define a transform, so treat four as the floor and design for more. Place 8 to 12 dots, then walk each planned scan position and confirm at least four identities stay visible, non-collinear and unclipped. Spread them through all three axes: dots only on the base plane leave rotation about the vertical poorly constrained.

Dots may live on the fixture instead of the part when the part surface must stay untouched; the fixture then must not move between the first and last capture. On shiny or dark surfaces, seat each dot on a small matte patch so the blob stays round instead of doubling in a reflection. Keep dots at least a diameter away from edges, where clipping rounds the code ring and kills the decode.

When dots still mis-decode, the cause is almost always pixel count or contrast — the same two failure modes behind checkerboard calibration grid-pitch errors.

Keeping the heads still

A head that shifts between captures drags every target coordinate with it, and the solver hides the shift inside larger residuals. Mount each head on a stand that returns to the same pose: a slide-table stand such as the LS-MNT-0040 holds a head at a set height on its 700 mm column over a 400 x 450 mm base, so removing and refitting the head lands back on the same geometry.

Camera standsMachine vision camera stand, professional slide-table type, height 700 mm, 400 x 450 mm base (LS-MNT-0040)LS-MNT-0040
Type
Camera stands
$629.00View partBuild a system with it

Heat moves geometry too: a rig aligned in a cold shop can drift by the afternoon shift, which shows up as soft dots and rising residuals. Re-check focus and target sharpness whenever the shop temperature has moved by more than a few degrees, and recapture the reference scans if the dots have gone soft. A multi-head rig around a large part repeats these rules at every head; galvanometer stereo heads such as the MV-DLS300P-04 sweep a laser projection across the scene, so during aiming keep the swept plane below eye level and follow the laser class printed on the housing. Hosts that carry several heads at once keep them apart by serial number, as in selecting each depth camera by serial number.

3D sensorsHikrobot MV-DLS300P-04 Laser galvanometer stereo cameraMV-DLS300P-04
Type
Stereo / structured light
$16,579.00 · quotedView and quote

Build the rig from the camera stands range or start at the stand configurator.

Where the usual answer is wrong

  • Fewer than four shared dots in a scan pair leaves the pair on a weak constraint or unmatched. Add dots where viewing zones overlap before adding more captures.
  • A part re-fixtured mid-sequence can flex. Then no rigid transform joins the two states, and the targets will happily merge clouds that no longer describe one shape. Check the part's repeatability before blaming the solver.
  • Scale bars add nothing between metric sensor clouds, but they matter the moment photographs join the set, because photo-only alignment has a free scale.
  • Smooth parts give ICP nothing to hold; let the targets carry the alignment and skip the polish.
  • Very wide flat parts never need a merge at all: a line-scan 2.5D system such as the MV-HLVS-16K100-L60 reads a 600 mm strip at 16K resolution in one pass over the part.
3D sensorsHikrobot MV-HLVS-16K100-L60 Line-scan 2.5D, 16K resolution, Sampling rate 120 kHz, Emitting area length 600 mmMV-HLVS-16K100-L60
Type
2.5D inspection
Price on requestView and quote

After the merge, keep the result workable. Storing the cloud in a voxel grid tames the file, and when you quote volumes from segmented regions, voxel-spacing volume calculation shows how spacing sets the volume error — registration error lands in that same budget.

Checks before you order and run

  • Compute g from pixel pitch, focal length and working distance; confirm your dot diameter gives n ≥ 10 px at the farthest position.
  • Walk every scan position and count visible coded identities: at least four per scan, non-collinear, unclipped.
  • Confirm the fixture cannot move between the first and last capture; if it can, the dots go on the part.
  • Seat dots on matte patches over shiny or dark surfaces.
  • After the first solve, read the residual: expect roughly your centroid noise — 0.007 mm in the example above — and investigate anything near the point-spacing scale.
  • Merge on targets first, then run a local ICP polish only over shared textured overlap.

Choosing the hardware

Pick heads by task from the 3D sensors category or the camera finder, add stands that hold position, and put a multi-head or multi-position quote together on the quote page. More on placement, calibration and cloud handling sits on the 3D topic page, and set-up questions reach the applications team through the contact page.

Questions

Can plain circular dots replace coded targets?

Yes, but the software can then no longer match them for you. A plain dot is anonymous: someone picks the same dot in each scan by hand, which is slow, and one wrong pick bends the whole solve. Coded dots carry a ring pattern that identifies each marker, so the solver matches identities on its own and a wrong match shows up as a residual outlier you can delete. Beyond two scans, coded dots pay for themselves.

Do the targets have to be stuck on the part itself?

No. Dots on the fixture or table around the part work as long as the fixture does not move between the first and last capture, and they keep the part surface untouched. Put targets on the part when it is re-fixtured mid-sequence or when the fixture blocks the viewing angles; the dots then travel with the surface and still give the solver its correspondences.

What residual should a target solve report?

Expect a residual near your centroid noise rather than near the scan's point spacing. In the 500 mm example that is about 0.007 mm against a point spacing around 0.07 mm. If the reported residual climbs toward the point-spacing value, at least one target moved between captures: delete the outlier dot from the solve and re-run it before changing anything else.

Does the method work across different sensor types?

Yes. Every calibrated head returns millimetres, so a profiler scan and a structured-light scan of the same part align through the same shared dots with one rigid transform each. Each scan pair still needs to see at least four of the same dots. With a single sensor type in a fixed rig, a one-time extrinsic calibration replaces the targets entirely.