Cameras & sensorsApplication note

Board level cameras for stereo photogrammetry: sync and timestamps

Build a four-head board level camera rig for stereo photogrammetry: link bandwidth per camera, trigger sync, per-frame timestamps, lens choice and parts.

LumaSpec Vision13 min read Share on LinkedIn

On this page 10 sections
  1. 01The rig, stated as numbers
  2. 02Pick the head: GigE, M12, global shutter, mono
  3. 03Sizing the links: four 1280 x 720 mono heads at 60 fps
  4. 04Lenses and geometry: where the 2 mm lens lands
  5. 05Holding four shutters together
  6. 06Mono heads and the IR ring light
  7. 07Timestamps you can pair afterwards
  8. 08Six pitfalls that sink four-head GigE rigs
  9. 09The decision, case by case
    1. Before you order
  10. 10Questions

You want a stereo photogrammetry rig that hides behind its optics: four mono heads small enough to sit 25.4 mm apart, an M12 lens with an IR ring light around each one, 1280 x 720 at 60 fps, four cameras into one small PC over GigE, a timestamp on every frame, capture running to two SATA SSDs. Every piece of that brief lands below as a number: which board level camera heads fit, what four live streams cost a small PC link by link, how to hold four shutters together, and where the 2 mm lens helps and where it costs you. The worked example sizes the links at the stated resolution and frame rate; the same arithmetic rescales the rig for 30 fps, Bayer or higher bit depth in one step.

The rig, stated as numbers

Write the brief as a specification, and each line becomes a calculation later:

  • Four mono heads, global shutter, M12 mount, one IR ring light around each lens
  • 1280 x 720 px at 60 fps per head, 8-bit mono output
  • 25.4 mm between lens axes, 356 mm or more from lens to face
  • GigE into one small PC with several NIC ports, capture to two SATA SSDs
  • One timestamp per frame, one comparable clock across four heads

Three of those lines pick the hardware before any data sheet is opened. Mono, because the scene is lit with narrowband IR and a Bayer mask has nothing to separate under it. Global shutter, because two eyes that expose row by row at different moments cannot be aligned after the fact. GigE, because four cameras mean four independent links into one PC, and that is exactly what multi-port NICs are for. The 60 fps rate sets the frame period at 16.7 ms — half of that becomes the timestamp-pairing window later.

Pick the head: GigE, M12, global shutter, mono

Four filters cut the board level camera catalogue to a short list. M12 mount, because the optics and IR-pass filters already live in that barrel. GigE, because the capture plan routes four streams into one PC. Mono and global shutter, for the two reasons above. The board level camera selection for embedded vision machines guide walks the full filter set; here, one head clears all four at once.

The MV-CB016-10GM-M-W is that head: a 1.6 MP IMX296 global-shutter mono sensor in a 1/2.9" format, behind an M12 mount, on a board-level GigE body with a WTB GigE port. The array holds nearly double the 0.92 MP that a 1280 x 720 frame needs, so pixels are not the constraint — the link is, and the bandwidth section below sizes it.

Board-level camerasHikrobot MV-CB016-10GM-M-W 1.6 MP GigE board-level camera, IMX296, Mono, M12 lens mount, WTB GigE portMV-CB016-10GM-M-W
Sensor format
1/2.9"
Lens mount
M12
Interface
GigE
Resolution
Up to 3 MP
$559.00View partBuild a system with it

Two other shapes solve the same problem from different directions.

Board-level camerasGigE board camera with split sensor, 1.0 MP, Mono (LS-BCM-0059)LS-BCM-0059
Sensor format
1/4"
Lens mount
M12
$209.00View part
Board-level camerasBinocular camera / module, 1.3 MP, USB3, Colour/Mono, 1280 x 1024 @ 123FPS resolution (LS-BCM-0043)LS-BCM-0043
Sensor format
1/2"
Lens mount
M12
$179.00View part

A split-sensor board such as the LS-BCM-0059 divides one 1.0 MP mono sensor between two optical channels, so both views land on one exposure and sync is exact by construction. The cost is resolution per eye and a baseline the board sets rather than the bracket. A binocular module such as the LS-BCM-0043 mounts two heads on one board behind one clock and one USB3 cable. Its 1280 x 1024 stream at 123 fps is about 161 MB/s of 8-bit mono, comfortably inside one USB3 port. Choose the split sensor when zero skew beats baseline width; choose the binocular when one cable per pair beats everything else.

Inputs. 1280 x 720 px and 60 fps per head, from the brief. One byte per pixel, because the build runs 8-bit mono under narrowband IR. Four heads capturing in parallel. One tuned GigE port sustains about 110 MB/s — the 1 Gbit/s line rate minus GigE Vision, UDP and IP overhead, and the figure a tuned host reaches in practice.

The rule. Stream rate equals pixels per frame, times bytes per pixel, times frames per second. Divide the total across ports at the per-port ceiling.

stream (MB/s) = width × height × bytes per pixel × fps / 10^6 ports needed = total stream rate / 110 MB/s per tuned GigE port

The arithmetic.

  • 1280 x 720 = 921,600 px per frame, which at one byte per pixel is 0.92 MB.
  • 0.92 MB x 60 fps = 55.3 MB/s per head, or 442 Mbit/s.
  • Four heads: 4 x 55.3 = 221 MB/s, about 1.77 Gbit/s in total.

Result and decision. Run one head per NIC port: each port then sits at half its 110 MB/s ceiling, leaving room for the UDP resends GigE Vision generates when a packet drops. Two heads share a port only below 28 MB/s each — 30 fps at this resolution, since 2 x 27.6 = 55.3 MB/s. A single 1 Gbit/s switch uplink carries none of this: 221 MB/s is 1.77 Gbit/s. What moves the number: 8-bit Bayer costs the same as mono; 10-bit packed raises it 25% to 69 MB/s; unpacked 16-bit doubles it to 110.6 MB/s and one head then owns a port outright.

Storage follows the same stream. 221 MB/s x 60 s = 13.3 GB per minute, roughly 800 GB per hour. Two SATA SSDs in RAID-0 sustain about 800-1,000 MB/s sequential (400-550 MB/s per drive), a factor of about four of headroom; a single good SATA SSD can absorb 221 MB/s alone, but with little margin for spikes and background writes.

Lenses and geometry: where the 2 mm lens lands

The 2 mm lens is why the head stays small, and the reason the face lands in few pixels. Field of view at a working distance follows from sensor width and focal length:

FOV = WD × sensor width / f
How sensor width, working distance and field of view set the focal length Rays from the edges of the sensor pass through the lens and spread to the edges of the field of view. The ratio of sensor width to field of view is the magnification m.CameraField of view (FOV)Working distance (WD)≈ fsensor width slensm = s / FOVf = WD × m / (1 + m)
How sensor width, working distance and field of view set the focal length. Rays from the edges of the sensor pass through the lens and spread to the edges of the field of view. The ratio of sensor width to field of view is the magnification m.

A 1/2.9" type sensor has an active width near 4.9 mm. At the stated 356 mm standoff:

  • 2 mm: FOV = 356 x 4.9 / 2 = 872 mm wide, so 872 / 1280 = 0.68 mm per pixel, and a 150 mm face spans about 220 px.
  • 6 mm in portrait: FOV = 356 x 4.9 / 6 = 291 mm, a frame about 164 mm wide by 291 mm tall, 0.23 mm per pixel. The same face spans about 660 px and fills 92% of the frame width — aim carefully, or step to 5 mm for margin at 0.27 mm per pixel.

Depth error comes from disparity precision:

Δz ≈ z² × Δd / (B × f_px), f_px = f / pixel pitch

Pixel pitch for a 4:3, 1.6 MP array on a 4.9 mm sensor is near 3.4 μm, so f_px is about 590 px at 2 mm and 1,765 px at 6 mm. With 0.15 px of matching noise, typical for textured skin: z² x Δd = 356² x 0.15 = 19,010. At 2 mm, 19,010 / (25.4 x 590) = 1.27 mm of depth noise. At 6 mm, 19,010 / (25.4 x 1,765) = 0.42 mm. Depth error grows with the square of standoff — double 356 mm and both figures quadruple.

Decision: keep the 2 mm only when coarse shape is the deliverable. For skin-level geometry at 356 mm, fit 6 mm M12 lenses in portrait and accept the tight frame. Wide-M12 distortion is calibrated out in the photogrammetric solve either way.

Lens focal length, field of view and working distance
Units
Solve for
Focal length
– mm
Field of view
– mm
Working distance
– mm
Magnification
– x
Angle of view
– °
Pixel on the part
– mm

Thin-lens model: m = sensor width / field of view, f = WD × m / (1 + m). Accurate to a few percent above about 150 mm; check the lens's minimum object distance.

Find lenses with this focal length Open the full calculator

The camera resolution calculator runs the same pixels-per-face logic when standoff or face size changes.

Holding four shutters together

Three mechanisms put four heads on one clock, in order of preference here.

  1. One wired trigger. A pulse generator drives all four trigger inputs on the same edge. Skew comes from cable-length differences — about 5 ns per metre of mismatch — and from trigger latency, which matches across identical heads.
  2. A GigE Vision action command. One broadcast packet on a dedicated subnet; compliant cameras execute it in hardware, and the spread across four heads lands in the tens of microseconds on a switched link.
  3. IEEE 1588 (PTP). GigE Vision cameras that support it align their clocks to sub-microsecond offsets after settling. PTP does not fire shutters by itself; pair it with a trigger or action command and use it to make the four timestamp streams comparable.

How much skew the face forgives, in numbers: at 60 fps the frame period is 16.7 ms, and a face moving 300 mm/s shifts 0.03 mm in 0.1 ms — about 0.13 px of disparity at 0.23 mm/px, under the 0.15 px matching noise. One millisecond of skew becomes 1.3 px of disparity and turns into roughly 3.7 mm of depth error at the 6 mm setting. Wired trigger or action command, then — never NIC arrival order.

For the wiring itself, stereo camera trigger synchronization with a shared pulse shows the shared-pulse set-up, and hardware trigger configuration per camera gets each head out of free run. Trigger voltage and current levels are per-camera manual values; match the pulse source to them before wiring.

Mono heads and the IR ring light

Skin under narrowband IR is a low-contrast, textured target; the light and the sensor decide whether matching works at all.

  • Mono over color. A mono sensor records clean intensity on every pixel. Under narrowband IR, a color sensor's Bayer mask splits the same signal across channels, and demosaicing invents color that is not there while softening texture.
  • 850 nm or 940 nm. 850 nm is the usual pick: silicon sensors and LEDs both respond strongly, and residual glow through the filter is faint. 940 nm reads darker on the sensor but is nearly invisible, to eyes and to other cameras.
  • An IR-pass filter per lens. Mono heads ship without an IR-cut filter, so the IR-pass in the M12 barrel is what shapes the spectrum: room light and visible clutter fall away and the ring dominates exposure.
  • Pulse the ring instead of running it continuously. Pulse width sets motion blur: at 100 mm/s, a 1 ms pulse smears 0.1 mm, under one 0.23 mm pixel at the 6 mm setting. Short pulses also let the LEDs run brighter for the brief moment the shutters are open.

Timestamps you can pair afterwards

Photogrammetry pairs frames after capture, so the stamp must describe the exposure, not the host's arrival time. Camera-side stamps latched at exposure stay clean across four separate NICs; host arrival times pick up GigE Vision frame arrival jitter and can drift by milliseconds under load. With PTP alignment, all four heads stamp on one clock and pairing reduces to nearest-stamp within half the frame period — 8.3 ms at 60 fps.

Log exposure and gain with every frame, as per-frame exposure and gain metadata describes, so a drifted head shows up in the data rather than in the point cloud. Run fixed exposure across heads by default; when per-head illumination genuinely differs, auto exposure per stereo camera in a depth rig is the pattern to copy. Pairing four timestamp streams by nearest stamp is the same job as asynchronous vision result frame matching with timestamps, with two more sources.

Six pitfalls that sink four-head GigE rigs

  1. Free run. Heads left in continuous mode grab when they like, and the pair looks synced in single shots but is not. Set trigger mode per camera before judging anything else.
  2. One switch uplink for four heads. The worked example's 221 MB/s cannot pass a 1 Gbit/s uplink; a switch does not create bandwidth. One port per head, or a multi-gigabit uplink.
  3. Host arrival stamps. Milliseconds of NIC jitter disguised as sync. Stamp in the camera, align with PTP.
  4. Auto exposure per head. Two eyes disagreeing about brightness break matching. Fixed exposure, with LED pulse width as the brightness control.
  5. Rolling shutter anywhere in the rig. Even with a shared start, rolling rows expose at different moments, and a moving face gains row-dependent skew. Global shutter on all four.
  6. Rings wider than the baseline. With lens axes 25.4 mm apart, a ring much wider than about 25 mm collides with its neighbour. Use slim rings sized to the spacing, or one soft IR source per side.

When a still face still yields a shimmering depth map, timing or mounting is the usual cause rather than the sensor — troubleshooting stereo depth jitter and IMU drift works the same failure pattern end to end.

The decision, case by case

  • The brief as stated — four heads, one PC: run four MV-CB016-10GM-M-W heads, one per NIC port, on a wired trigger or action commands, with stamps aligned by PTP. Fit 6 mm M12 lenses in portrait with 850 nm IR-pass filters, slim rings between them, and record to two SATA SSDs in RAID-0 at 13.3 GB/min.
  • One cable per pair beats everything: the LS-BCM-0043 binocular module carries both eyes on one clock and one USB3 cable. A 1280 x 1024 stream at 123 fps from a two-head module is about 161 MB/s of 8-bit mono, well inside one USB3 port. The baseline is the module's bracket, so the rig geometry is set by the part.
  • Zero skew outranks baseline width: the LS-BCM-0059 split-sensor head takes both views in one exposure on one sensor; resolution per eye halves and the board sets the baseline — the price of sync that is exact by construction.

Before you order

  • One NIC port per head at 60 fps: a four-port NIC, jumbo frames set on every port.
  • The pulse source matched to the camera manual's trigger voltage and current levels.
  • Disk budget at 13.3 GB per minute, so session length planned against SSD capacity.
  • Lenses: 6 mm M12 in portrait, IR-pass filters matched to the ring wavelength, distortion calibrated in the solve.
  • Rings: outer diameter under about 25 mm per head, or one light per side.

Everything above is stock parts: heads from the board level cameras line, housed alternatives from area scan cameras when a bare board is too exposed. The camera finder filters by mount, interface and shutter, and the cameras topic page collects the surrounding guides. For a configured four-head set, start the camera configurator; anything the filters do not resolve, the contact page reaches the applications team.

Build the whole station

The configurator matches a camera, lens, light, light controller and cables to each other, step by step, and lists only parts that fit what you already picked.

Start with the camera

Questions

Can two cameras share one GigE port at 60 fps?

Not at 1280 x 720 mono: one stream is about 55 MB/s and two together sit at the roughly 110 MB/s practical ceiling of a tuned GigE port, so drops and resends appear under load. Run one camera per port, or drop both to 30 fps — about 27.6 MB/s each — and share a port with margin. A 2.5 or 10 Gigabit NIC removes the constraint entirely.

How much timestamp skew can a face scan tolerate?

Scale it by motion speed. A face moving 300 mm/s shifts 0.03 mm in 0.1 ms of skew, which is about 0.13 px of disparity at 0.23 mm/px — below the 0.15 px matching noise. One millisecond of skew becomes 1.3 px of disparity and turns into millimetres of depth error. Hold skew near 0.1 ms for expressive sessions; a still face forgives a millisecond.

Why mono sensors instead of color for an IR ring light?

An IR-pass-filtered mono head records one clean intensity per pixel and keeps the silicon's full sensitivity at 850 nm. A color sensor splits the same narrowband signal across a Bayer mask, so demosaicing invents color that is not there and softens texture — exactly the detail photogrammetry matches on. Mono is also the native output of these board-level heads, so no conversion sits in the pipeline.

Is a 25 mm baseline enough for face depth at 356 mm?

Yes at this scale. With a 6 mm M12 lens, a 25.4 mm baseline and 0.15 px of matching noise, depth error at 356 mm works out near 0.4 mm. Error scales with the square of distance and inversely with baseline and focal length: doubling the standoff to 712 mm quadruples it to about 1.7 mm, so widen the baseline or move closer before changing the lens.

Do I need a frame grabber to sync four GigE cameras?

No. GigE Vision cameras carry trigger inputs, action commands and IEEE 1588 (PTP) time sync over standard Ethernet, so a multi-port NIC plus one trigger line does what a frame grabber once did: one port per camera, shutters fired together, stamps read from the camera clocks. Frame grabbers still earn their slot for Camera Link and CoaXPress heads, not for a GigE build like this.