Output format and COLMAP compatibility
Starting from LIMAP 2.0.0, the toolbox is fully compatible with the COLMAP ecosystem. Every mapping and SfM pipeline writes a plain COLMAP model, with the 3D structures stored alongside it under structures/. There is no conversion or export step, and no LIMAP-specific container wrapped around the COLMAP data.
final_model/
cameras.bin # COLMAP: intrinsics
images.bin # COLMAP: poses and 2D-3D point observations
points3D.bin # COLMAP: 3D points
rigs.bin
frames.bin
structures/
lines3D.bin # 3D line tracks
groups3D.bin # vanishing points, planes, primitives
wireframe3D.bin # 3D wireframe edges
structures2d.bin # per-image 2D structures and associations
Because the COLMAP files sit at the root of the model directory, anything that reads a COLMAP model reads a LIMAP reconstruction directly and simply ignores structures/. Nothing needs to be converted or exported:
import pycolmap
recon = pycolmap.Reconstruction("outputs/.../final_model")
print(recon.num_images(), recon.num_points3D())
The same directory opens in the COLMAP GUI, and can be fed back into COLMAP’s own tooling (model_converter, dense reconstruction, and so on).
Inheriting COLMAP advances
Compatibility is not only about the file format. The point side of the pipeline comes directly from COLMAP: LIMAP consolidates with its scene types (Image, Camera, Reconstruction, Track, Rig, Frame), its database, its estimators, its correspondence graph and various incremental mapper logic, and adds the structures on top rather than maintaining a parallel implementation. Improvements on the COLMAP side are therefore inherited rather than reimplemented:
Multi-camera rigs. Reconstructions use COLMAP’s rig and frame model - hence
rigs.binandframes.binabove, and the bundle adjustment can refine the rig extrinsics and the per-frame poses (refine_sensor_from_rig,refine_rig_from_world), alongside the line, group and wireframe residuals.Two-view geometry. Image pairs are verified and initialised with COLMAP’s own two-view geometry estimation, and the line and group correspondences are carried in the same
TwoViewGeometrystructures as the point matches.
Upgrading the pinned COLMAP version therefore benefits the structure pipelines too, without changes on the LIMAP side.
Reading the structures
To read the structures as well, use limap.scene.HolisticReconstruction, which holds both halves:
from limap.scene import HolisticReconstruction
recon = HolisticReconstruction()
recon.read("outputs/.../final_model")
print(recon.point_recon.num_points3D()) # pycolmap.Reconstruction
print(recon.structure_recon.num_lines3D())
print(recon.structure_recon.num_groups3D())
point_recon is an ordinary pycolmap.Reconstruction, so the point and pose side of the API is unchanged. HolisticReconstruction.exists_model(path) reports whether a directory holds both parts.
Text output is available through write_text / read_text, with the binary format used by default.