Holistic 3D mapping

Line mapping on a set of posed images

As one of the main features, LIMAP supports line reconstruction on a set of posed images provided as a COLMAP model, optionally jointly with points. The main entry point is the CLI:

python -m limap.cli.automatic_point_line_triangulation \
    -m ${COLMAP_MODEL_PATH} \
    -i ${IMAGE_PATH} \
    -o ${OUTPUT_DIR}

where -m is the path to the COLMAP sparse model (cameras/images/points), -i the image folder, and -o the output directory. The reconstruction (points + lines) is written to ${OUTPUT_DIR}/final_model. The configuration defaults to cfgs/structure_triangulation/default.yaml and can be overridden with -c or per-key command-line flags.

For a complete worked example on Hypersim, see Quickstart, or the dataset runner runners/hypersim/structure_triangulation.py.

Holistic mapping with groups and the wireframe

automatic_point_line_triangulation reconstructs points and lines only. To additionally reconstruct the groups (vanishing points and planes) and the wireframe, and to optimize all of them jointly with the camera poses, use:

python -m limap.cli.automatic_structure_triangulation \
    -m ${COLMAP_MODEL_PATH} \
    -i ${IMAGE_PATH} \
    -o ${OUTPUT_DIR}

The arguments are the same as above. The bundle adjustment then additionally enforces the vanishing point and plane constraints (orthogonality and parallelism) on the associated lines and points. The 3D structures are written to ${OUTPUT_DIR}/final_model/structures/, alongside the COLMAP model itself; see Output format and COLMAP compatibility.

Plane detection runs a monocular network and needs a GPU; see Vanishing points, planes and groups for the detectors involved and for how to switch groups off.

Line mapping on a set of unposed images by running COLMAP first

To run line mapping on a set of unposed images, first pose the images with COLMAP following the guide here. Then pass the resulting sparse model to the triangulation CLI above via the -m argument, along with the corresponding image folder via -i.

This poses the cameras from points alone and reconstructs the structures afterwards, on top of frozen poses. LIMAP can instead recover the poses and the structures together, so that lines and groups constrain the bundle adjustment throughout the reconstruction; see Holistic incremental SfM.

Using auxiliary depth maps

When depth maps are available, the 3D line map can be built with geometry-guided line reconstruction instead of triangulation. See the runner runners/hypersim/geometry_guided_line_reconstruction.py and the limap.runners.line_reconstruction_with_depth_maps() API, configured via cfgs/geometry_guided_line_reconstruction/.