Two depth cameras pointed at the same moving part give you two streams of frames with two unrelated sets of timestamps. Each camera counts time on its own internal hardware clock from the moment it powers up, and no SDK feature quietly links those clocks across devices. Within one camera, depth and color frames share a time base — see depth and color synchronization: check the right timestamps — but across cameras the timestamps are not comparable, and host arrival times carry too much queueing jitter to fix it. This guide shows you how to measure the offset between cameras with a shared visual event, when to prefer a hardware trigger, and how to keep multi-camera depth streams from corrupting each other.
Why the timestamps do not line up
A depth camera stamps each frame with the reading of its own hardware clock. That clock starts at zero when the device boots, runs on its own crystal, and drifts against every other camera's crystal. Three problems stack up:
- Different origins. Camera A and camera B boot at different times, so equal timestamps mean different instants.
- Different rates. Two crystals differ by tens of parts per million, so an offset measured once decays over minutes.
- No cross-link. USB and Ethernet carry no shared clock signal to the cameras; only a dedicated trigger line does.
Host-side arrival timestamps do not rescue you: they include driver queueing and bus transfer time, which varies frame to frame by milliseconds. If you need to know that two exposures happened within, say, 5 ms of each other, you have to build the time relation yourself.
The shared sync-event method
The idea is simple: make something visible happen that every camera can see, capture it, and measure where it lands in each stream.
A strobed light filling the scene is the cleanest event. A light controller with a strobe output pulses a light on command, and the pulse lands inside exactly one frame per camera. You find, per camera, the first frame whose brightness jumps, and the difference of those frames' device timestamps is the clock offset.
For stereo cameras with controllable IR emitters there is a zero-extra-hardware variant: disable every emitter, stream all cameras, then flash one camera's emitter for a few frames. The texture change shows up in the other cameras' IR or depth views. The catch is interference, covered below — verify depth quality during the flash before trusting those frames.
Step by step: measure the offset with a strobed light
What you need: the cameras mounted and streaming, one strobed light and a controller that can fire it from your application, and a script that records per-frame device timestamps and mean intensity.
- Fix exposure. Set every camera to fixed exposure and gain. Auto exposure reacts to the flash and smears the brightness step over several frames, which ruins the measurement. This is the same failure mode described in contour position jitter under automatic exposure.
- Record a baseline. Stream all cameras for two seconds with the light off, logging device timestamp and mean intensity per frame.
- Fire the pulse. Pulse the light once, 20–50 ms wide, so it spans at most one frame interval per camera.
-
Find the flash frame. For each camera, mark the first frame whose mean intensity exceeds the baseline median by, say, 20 percent. Call its device timestamp
t_flashfor that camera. -
Repeat and take the median. Fire 10–20 pulses a few seconds apart and take the median of
t_B(flash) − t_A(flash)per pulse. The median rejects the occasional pulse that straddles a frame boundary. - Track drift. Log the offset against wall-clock time over your longest expected run. Fit a slope; that is your drift rate. Extrapolate between calibrations and re-run after any camera power cycle, because a reboot resets that clock's origin.
A 4-channel 24 V digital controller such as the LS-CTL-0322 can drive the sync light and your inspection lights from one unit, with a strobe feature to time the pulse against the acquisition cycle. For how hard you can drive a strobed light without overheating it, see strobe machine vision light: overdrive, duty cycle and timing.
- Output
- Constant voltage 24 V
- Channels
- 4 channels
- Control
- Digital
Worked example
Two cameras run at 30 fps (frame period 33.3 ms). You pulse a light 15 times and record, per pulse, the flash frame's device timestamp.
- Camera A, pulse 1:
t_A = 10 041 220 µs - Camera B, pulse 1:
t_B = 8 902 905 µs - Raw difference:
8 902 905 − 10 041 220 = −1 138 315 µs
The 15 pulses give differences of −1 138 315 µs (±1 frame period of quantization); the median is −1 138 340 µs. So:
A frame from camera B stamped 8 905 000 and a frame from camera A stamped 10 043 340 describe the same instant. Now the exposure-time difference the application actually wanted falls out directly: subtract the corrected timestamps of any two frames.
Uncertainty is one frame period, about 33 ms at 30 fps, because you only know which frame caught the flash, not where inside the exposure. Median-filtering many pulses cleans up outliers but cannot beat that floor. If you need millisecond or tighter alignment of the exposures themselves, move to hardware triggering.
When a hardware trigger is the better answer
A shared timing event measures the offset after the fact. A shared electrical edge removes the problem: wire one trigger source to every camera's trigger input and each exposure starts on the same edge, aligned to microseconds rather than to a frame period.
The details that make or break this — a common signal reference, correct line polarity, trigger widths, and what the GenICam line settings should be — are covered in camera trigger common reference: diagnose missing responses and camera hardware trigger frame rate with external pulses. Not every depth camera exposes a trigger input, so check the datasheet before committing to this route; if it does, prefer it over the flash method for anything that moves fast.
When several cameras must also be geometrically related, do the time work first, then the spatial work: multi camera extrinsic calibration in one shared coordinate frame assumes corresponding points were captured at the same instant.
Interference: not every depth technology tolerates a neighbour
Pointing several depth cameras at one surface is only safe for some technologies:
| Technology | Multi-camera on one scene | Notes |
|---|---|---|
| Passive stereo or stereo with texture projector | Usually fine | Extra projected texture can even improve matching |
| Projected structured light (fixed pattern) | Poor | Second projector corrupts the pattern; depth fails or goes noisy |
| Time-of-flight | Moderate | Multi-path interference; stagger or modulate emission |
A laser-galvanometer stereo unit like the MV-DLS300P-04 relies on matching rather than decoding one pattern, which tolerates co-viewing better than a fixed-pattern projector. A compact ToF sensing camera such as the MV-DT01WMU needs emission planning when several ToF units share a workspace. Check the 3D sensors finder's type filter before adding a camera to an existing multi-camera cell.
- Type
- Depth / ToF camera
- Type
- Stereo / structured light
If images from one camera glitch only while another streams, you are likely looking at shared-bus or power trouble rather than optical interference — multi-camera image corruption: isolate shared hardware faults walks the isolation sequence.
Checklist before you trust the alignment
- Fixed exposure and gain on every camera, auto modes off.
- Flash detection threshold well above ambient variation but below saturation.
- At least 10 pulses, median taken; outliers at frame boundaries rejected.
- Offset re-measured after any power cycle, and drift slope known for the run length.
- Depth quality during emitter flashes verified, not assumed.
- Trigger wiring checked against a common reference if you use the hardware route.
- A moving-object validation test: wave a target through the overlap region and confirm both corrected timestamps describe one trajectory.
For applications that also stitch several shots into one result, the same timing discipline feeds multi image capture per trigger: get an image set from one shot. Coordinating events across several viewer windows in a LabVIEW host has its own pitfalls, covered in a knowledgebase article on synchronizing LabVIEW events across multiple views.
Once time and space are both tied down, pick the rest of the parts in the system configurator, or contact us with your frame rates and camera count and we will check the bus, trigger and controller budget with you.
Questions
Do depth cameras share a timestamp base when connected to the same PC?
No. Each device counts time on its own internal hardware clock that starts when the camera powers up, so identical-looking timestamps from two cameras refer to different time lines. The host PC receives frames with per-device timestamps and its own arrival times, but arrival time includes queueing and USB transfer jitter, so it is only good to a few milliseconds. For tighter alignment you need a shared event or a shared hardware trigger, not the SDK's default timestamps.
How accurate is the sync-event method?
The offset you measure is accurate to about one frame period, because you can only see in which frame the flash landed, not where inside the exposure it happened. At 30 fps that is roughly 33 ms of uncertainty; at 90 fps about 11 ms. Averaging several flashes does not beat that floor. If you need tighter alignment, use a hardware trigger line so both cameras start their exposures on the same electrical edge, which aligns them to microseconds.
Can I just turn one camera's IR emitter on and off as the sync event?
Often, yes, if the SDK exposes emitter control and the other cameras can see the projected pattern or its absence. Disable all emitters, run the streams, then flash one emitter for a few frames. The change appears in every camera that views the illuminated surface. The caveat is interference: some structured-light cameras corrupt each other's depth when their patterns overlap, so verify depth quality during the flash before trusting the sync frames, and expect the projected texture to change depth values momentarily.
Why do multi-camera depth streams interfere with each other?
Projected-pattern cameras decode depth from the integrity of their own projected pattern. A second projector laying a different pattern on the same surface destroys that integrity, and depth fails or becomes noisy. Stereo cameras with a texture projector tolerate it better, because the projector only adds features to match — extra texture from another camera can even help. Time-of-flight cameras interfere through multi-path reflections and need staggered or modulated emission. Check which technology each camera uses before aiming several at one surface.
How often should I re-run the sync calibration?
Clocks drift apart continuously, so a one-time offset decays over minutes to hours depending on the crystals involved. Re-flash the sync event periodically — every few minutes for critical work — and track the measured offset over time to learn your system's drift rate, typically tens of microseconds per second. Once you know the drift rate you can extrapolate between calibrations. A full power cycle resets a camera's clock origin, so always re-sync after any camera reboots or is re-enumerated on the bus.


