Atlas Reference-Object Scale π
Atlas Reference-Object Scale π β measure the scene from a person, a door, a building
- solve
- solve
- camera_height_m
Here's the honest problem with solving a camera from one photo: the solve nails focal length and orientation, but absolute size is unknown. A photograph of a city block could be a model village shot at 2 metres or the real thing at 200 metres - geometrically the two are identical until something tells you the scale. AtlasReferenceScaleSolve is that something. You mark the pixel box of an object you know the size of, and it fixes the solve's metric scale by single-view geometry.
This is the most reliable way to set camera height in the pack, and it composes after any solve node - including the learned GeoCalib solve, which this is the natural follow-on to.
The mechanism
Pick a reference from the dropdown (17 registry entries - person at 1.75 m, door at 2.10 m, cars, buses, shipping containers, basketball hoop, building storeys, even the Eiffel Tower tip at 330 m), then drag a box around it on the image. The key subtlety is in the tooltips: bbox_y0 is the top edge (smaller y) and bbox_y1 is the bottom edge - the object's base sitting on the ground. The node uses the solve's orientation plus focal and that base-to-top pixel height to compute the actual camera height by geometry, with no assumed eye height. That's the bit that makes it trustworthy: it's measuring, not guessing.
You get the solved camera height back as a camera_height_m FLOAT output, plus the updated solve with the metric scale locked in.
Inputs that matter
- reference_id - pick the closest match. Erring toward "common, approximate" is fine; the registry entries are honest heuristics, not metrology.
- bbox_x0 / y0 / x1 / y1 - the four corners of the object's box. Get the base on the ground line right; that's where the geometry anchors.
- height_override_m - when you know the real height of the object, type it here (0 = use the registry value).
- storey_count - the hidden gem. On any plate with buildings, this is the anchor that survives a high vantage where people and cars are too small to measure. Count the storeys of one building visible base-to-roof, drop the number in, and the node derives real height as
count Γ storey_height_m(default 3 m per storey - and yes, prewar and commercial floors run taller than modern residential, which is whystorey_height_mis a dial, not a constant).
Where people get burned
Don't use a partially occluded object. The box has to span the object's true base to its true top - if the person is cropped by a car, or the building vanishes into haze before the roof, your scale lands wherever the truncation was, silently. Also remember a high vantage makes ground-level references hopelessly small; that's exactly the case the storey_count route exists for. Count the storeys, don't measure the cars.
Install
This one is pure core - no GPU, no extra pip installs, just the pack:
cd <ComfyUI>/custom_nodes
git clone https://github.com/mikejamesvfx/atlas-camera.git
Restart and you'll find it under Atlas/02 Β· Orient & Scale (or the same pack via ComfyUI Manager, searching "atlas-camera"). The node's Atlas/advanced menu listing is the only wrinkle - it's tested and supported, just gated out of the quickstart path like the rest of the advanced folder.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| solve | ATLAS_SOLVE | β | |
| reference_id | COMBO | 17 options: person_175cm, door_210cm, sedan_car, city_bus, shipping_container_20ft, shipping_container_40ft, +11 | |
| bbox_x0 | FLOAT | 0 | β |
| bbox_y0 | FLOAT | 0 | Top edge (smaller y) of the object box. |
| bbox_x1 | FLOAT | 100 | β |
| bbox_y1 | FLOAT | 400 | Bottom edge (larger y) β the object's base on the ground. |
| height_override_mopt | FLOAT | 0.00 | 0 = use the reference's registry height; else override in metres. |
| storey_countopt | INT | 00β200 | COUNT THE STOREYS. On any plate with buildings this is the anchor that survives a high vantage, where people and cars are too small to measure. Pick one building visible base-to-roof, count its levels, and put the number here β the real height is count x storey_height_m, so you never type a product. 0 = off. Overrides height_override_m when set. |
| storey_height_mopt | FLOAT | 3.00.5β10 | Metres per storey. 3.0 matches the building_story_3m registry entry; the NYC birdseye doctrine measured a prewar tenement at 3.5. Prewar and commercial floors run taller than modern residential β this is a real difference, so it is a dial rather than a constant. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| solve | ATLAS_SOLVE | β |
| camera_height_m | FLOAT | β |