Atlas Solve Camera from Image
Atlas Solve Camera from Image — turning one photo into a real camera
- image
- raw_meta
- solve
- report
This is the heart of the whole pack. Where most "image to 3D" tools generate a mesh, AtlasSolveFromImage does the inverse-problem job a projection pipeline actually needs: it recovers a metric pinhole camera from a single photograph - focal length, orientation, horizon, and a confidence value. Feed the resulting ATLAS_SOLVE to the geometry, mask and export nodes and the photograph reassembles exactly from the recovered viewpoint. If you're a matte painter, this is the node that replaces an afternoon of agonising over a Nuke camera solve with one queue.
It's the stage underneath AtlasInput, the pack's one-node front door. If you never want to think about individual nodes, AtlasInput runs this for you. Reach for the raw node when you want control over focal hints, or to swap in a specific solve path.
How it works
The default path is a deterministic geometric solve: it detects straight lines in the image and finds vanishing points, then derives focal length and gravity from how those lines converge. No diffusion, no learned weights - that's why it's deterministic and why the report comes with a confidence value. The README's install tiers spell out the cost: core solves with nothing installed, but the vanishing-point detection needs NumPy + OpenCV, which the pack calls the [vision] tier.
There's also a learned alternative - AtlasLearnedSolveFromImage uses the GeoCalib prior and is far more robust on AI-generated images that have no clean straight edges converging to consistent vanishing points. Start with the geometric solve on real photography; switch to GeoCalib when the lines aren't there.
Inputs that matter
- image - the photograph, straight from a
LoadImage. - focal_length_mm - 0 means auto-detect. If you know the lens, type it in; if you wire a
raw_metafromAtlasLoadRAW, EXIF supplies it. - sensor_width_mm - defaults to 36 (full frame). Leave it unless you know your sensor.
- detect_vanishing_points - on by default. Turning it off gives a metadata-only solve: no focal from lines,
cam_y=0, which means black depth and blockout downstream. You'll know when you've done this by accident because everything suddenly looks flat.
Outputs
Two: the solve (ATLAS_SOLVE) and a report (STRING). Wire the solve into AtlasReferenceScaleSolve or AtlasScaleOverride next - a solved camera from one photo has orientation and focal, but scale is assumed, and an assumed scale that's ~10× too small on a wide exterior is exactly the silent trap this pack keeps warning you about. The report tells you which scale tier you're in. Read it once.
Install
cd <ComfyUI>/custom_nodes
git clone https://github.com/mikejamesvfx/atlas-camera.git
Core runs on nothing; for the vanishing-point path add OpenCV:
"<ComfyUI>/python_embeded/python.exe" -m pip install opencv-python
Or search "atlas-camera" in ComfyUI Manager. If you get a solve that's clearly tilted or has no depth, the usual culprit is OpenCV missing so the node silently ran the metadata-only path - check the report, not just the preview.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| focal_length_mmopt | FLOAT | 0.00 | 0 = auto-detect, or EXIF via a wired raw_meta |
| sensor_width_mmopt | FLOAT | 36.00 | — |
| detect_vanishing_pointsopt | BOOLEAN | true | Run line/VP detection. Off = metadata-only solve (no fx, cam_y=0 -> black depth/blockout). |
| raw_metaopt | ATLAS_RAW_META | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| solve | ATLAS_SOLVE | — |
| report | STRING | — |