Dhi Labs, product A3

Fixed-Camera 3D: metric 3D from one camera you already have

No LiDAR, no stereo rig. This product turns an ordinary fixed camera into a metric 3D sensor by self-calibrating height, tilt, and focal length purely from the boxes of people already walking through the scene, then reports metric position, speed, and height for anything it tracks. Pure Python (numpy/scipy) math, no GPU, and no model weights involved. Most feed-forward monocular 3D work assumes a moving camera, where the baseline between frames is what makes triangulation possible. Fixed CCTV inverts that: the camera never moves, so there is no baseline, but the person walking through frame is not noise, it is the thing an operator actually wants measured. Scale instead comes from people of known, tightly distributed height acting as a running calibration target.

Honesty notes
Discloses the hard case No trained weights Self-calibrating

One verified number

0.16 mposition RMSE, 5 m height / 30 deg tilt camera (easy case)
4.30 mposition RMSE, 3 m height / 20 deg tilt camera (disclosed hard case)

Measured result across the default camera sweep

camera (truth)position RMSEposition p90speed MAEheight MAE
3 m, 20° tilt (hard case)4.30 m5.77 m0.353 m/s0.038 m
5 m, 30° tilt0.16 m0.23 m0.083 m/s0.056 m
8 m, 45° tilt0.19 m0.22 m0.076 m/s0.078 m

Explore the height / tilt grid (42 configurations, measured today)

Pick a metric, then click any cell. Each cell is one full run of the real self-calibrate-then-localize-then-speed pipeline against a synthetic scene at that mounted height and tilt (seed 0, 80 calibration walkers, 60 evaluation points, focal length scaled with height the same way the shipped 3-point sweep does). Darker red is worse (higher error or more sensitivity); green is better.

low
high (per-metric scale, not comparable across metrics)

Click a cell to see its full measured detail.

Why the hard case is in the table, not a footnote

The 3 m / 20 degree configuration is a genuinely ill-conditioned geometry for single-camera self-calibration: a shallow viewing angle makes far-field distances fragile even when the calibration residual itself is low. The calibrator's own diagnostic output flags exactly that, in the field the pipeline writes for every run:

"shallow/ill-conditioned geometry, low residual but far-field distances are fragile; treat positions beyond mid-scene as approximate"

We keep that configuration in the headline sweep, in the same table as the two easy cases, rather than dropping it as an outlier. The calibration's own sensitivity metric (sensitivity_m_per_half_deg in src/fixedcam3d/calibration.py) makes the mechanism visible: it perturbs the recovered camera tilt by half a degree and measures how far the median foot point's ground position moves in response. That is a real conditioning probe, not a confidence score bolted on afterward: the optimizer can converge to a low residual while still recovering a tilt that is off by a few degrees, and the residual alone cannot see that failure mode. In the grid above, watch how sensitivity climbs sharply as tilt drops toward 15 to 20 degrees at low camera heights, exactly where position RMSE also blows up, the same conditioning problem showing up in two different measured quantities.

Limitations, stated plainly