limap.sfm package

Triangulation of lines and groups – globally over all images at once, or incrementally as images are registered – together with the structure-aware incremental mapper and the pipeline driving it.

Global triangulation

Triangulates every structure from all its observations at once, for a reconstruction whose poses are already known.

class limap.sfm.GlobalLineTriangulationOptions
__init__(*args, **kwargs)

Overloaded function.

  1. __init__(self: limap._limap._sfm.GlobalLineTriangulationOptions) -> None

  2. __init__(self: limap._limap._sfm.GlobalLineTriangulationOptions, kwargs: dict) -> None

  3. __init__(self: limap._limap._sfm.GlobalLineTriangulationOptions, **kwargs) -> None

check(self: limap._limap._sfm.GlobalLineTriangulationOptions) bool
mergedict(self: object, kwargs: dict) None
summary(self: limap._limap._sfm.GlobalLineTriangulationOptions, write_type: bool = False) str
todict(self: limap._limap._sfm.GlobalLineTriangulationOptions, recursive: bool = True) dict
property enable_remerge

True)

Type:

(bool, default

property filtering2d_th_angular_2d

8.0)

Type:

(float, default

property filtering2d_th_overlap

0.5)

Type:

(float, default

property filtering2d_th_overlap_num_supports
Type:

(int, default

property filtering2d_th_perp_2d

5.0)

Type:

(float, default

property filtering2d_th_sv_angular_3d

75.0)

Type:

(float, default

property filtering2d_th_sv_num_supports
Type:

(int, default

property fullscore_th

1.0)

Type:

(float, default

property iou_threshold

0.1)

Type:

(float, default

property linker2d_options

LineLinker2dOptions(score_th=0.5, th_angle=5.0, th_overlap=0.05, th_smartangle=1.0, th_smartoverlap=0.2, th_perp=2.0, th_innerseg=2.0, use_angle=True, use_overlap=True, use_smartangle=True, use_perp=True, use_innerseg=False))

Type:

(LineLinker2dOptions, default

property linker3d_options

LineLinker3dOptions(score_th=0.5, th_angle=10.0, th_overlap=0.001, th_smartangle=1.0, th_smartoverlap=0.1, th_perp=1.0, th_innerseg=1.0, use_angle=True, use_overlap=True, use_smartangle=True, use_perp=False, use_innerseg=True))

Type:

(LineLinker3dOptions, default

property min_length_2d

20.0)

Type:

(float, default

property min_visible_views
Type:

(int, default

property num_outliers_aggregator
Type:

(int, default

property num_threads

-1)

Type:

(int, default

property scale_inv_th

0.01)

Type:

(float, default

property sensitivity_threshold

70.0)

Type:

(float, default

property use_point_assisted_triangulation

True)

Type:

(bool, default

property use_vp_assisted_triangulation

True)

Type:

(bool, default

property var2d

2.0)

Type:

(float, default

property wireframe2d_th

2.0)

Type:

(float, default

class limap.sfm.GlobalLineTriangulationController
__init__(self: limap._limap._sfm.GlobalLineTriangulationController, options: limap._limap._sfm.GlobalLineTriangulationOptions, reconstruction: limap._limap._scene.HolisticReconstruction, correspondence_graph: pycolmap._core.CorrespondenceGraph, exhaustive_match_neighbors: collections.abc.Mapping[SupportsInt | SupportsIndex, collections.abc.Sequence[SupportsInt | SupportsIndex]] = {}) None
run(self: limap._limap._sfm.GlobalLineTriangulationController) None
limap.sfm.global_line_triangulation(options: limap._limap._sfm.GlobalLineTriangulationOptions, reconstruction: limap._limap._scene.HolisticReconstruction, correspondence_graph: pycolmap._core.CorrespondenceGraph, exhaustive_match_neighbors: collections.abc.Mapping[SupportsInt | SupportsIndex, collections.abc.Sequence[SupportsInt | SupportsIndex]] = {}) None
limap.sfm.global_line_triangulation_pipeline(structure_db_cache: limap._limap._scene.StructureDatabaseCache, reconstruction: limap._limap._scene.HolisticReconstruction, options: limap._limap._sfm.GlobalLineTriangulationOptions, ba_options: limap._limap._estimators._bundle_adjustment.PointLineBundleAdjustmentOptions | None = None, exhaustive_match_neighbors: collections.abc.Mapping[SupportsInt | SupportsIndex, collections.abc.Sequence[SupportsInt | SupportsIndex]] = {}) None
class limap.sfm.GlobalGroupTriangulationOptions
__init__(*args, **kwargs)

Overloaded function.

  1. __init__(self: limap._limap._sfm.GlobalGroupTriangulationOptions) -> None

  2. __init__(self: limap._limap._sfm.GlobalGroupTriangulationOptions, kwargs: dict) -> None

  3. __init__(self: limap._limap._sfm.GlobalGroupTriangulationOptions, **kwargs) -> None

get_effective_group_types(self: limap._limap._sfm.GlobalGroupTriangulationOptions) list[limap._limap._geometry.GroupType]
get_init_ransac_thresh(self: limap._limap._sfm.GlobalGroupTriangulationOptions, arg0: limap._limap._geometry.GroupType) float
get_verification_thresh(self: limap._limap._sfm.GlobalGroupTriangulationOptions, arg0: limap._limap._geometry.GroupType) float
mergedict(self: object, kwargs: dict) None
summary(self: limap._limap._sfm.GlobalGroupTriangulationOptions, write_type: bool = False) str
todict(self: limap._limap._sfm.GlobalGroupTriangulationOptions, recursive: bool = True) dict
property enable_verification

True)

Type:

Enable group verification after parameter initialization (bool, default

property group_types

[])

Type:

(list, default

property init_ransac_thresh

{})

Type:

(dict, default

property min_cluster_size
Type:

(int, default

property min_num_supports_for_association
Type:

(int, default

property min_shared_features_for_group_connection
Type:

(int, default

property pixel_uncertainty_threshold

30.0)

Type:

Pixel uncertainty (std dev) threshold for line classification (0 = disable). Lines above threshold are classified as unreliable and refined separately in 2-step BA. (float, default

property verification_default_reproj_threshold

3.0)

Type:

Default reprojection threshold in pixels (when not set per-type) (float, default

property verification_default_vp_threshold

10.0)

Type:

Default VP verification threshold in degrees (when not set per-type) (float, default

property verification_filter_outliers

True)

Type:

Whether to filter outlier associations from validated groups (bool, default

property verification_min_inlier_ratio

0.5)

Type:

Minimum inlier ratio to validate group (float, default

property verification_min_num_inliers
Type:

Minimum inlier count to validate group (int, default

property verification_obs_inlier_ratio

0.8)

Type:

For multi-view

Type:

ratio of views that must pass (float, default

property verification_threshold

pixels (dict, default: {})

Type:

Inlier threshold per group type (-1 or missing = use default). VP

Type:

degrees, Plane/Sphere/etc

class limap.sfm.GlobalGroupTriangulationController
__init__(self: limap._limap._sfm.GlobalGroupTriangulationController, options: limap._limap._sfm.GlobalGroupTriangulationOptions, reconstruction: limap._limap._scene.HolisticReconstruction, correspondence_graph: pycolmap._core.CorrespondenceGraph) None
run(self: limap._limap._sfm.GlobalGroupTriangulationController) None
limap.sfm.global_group_triangulation(options: limap._limap._sfm.GlobalGroupTriangulationOptions, reconstruction: limap._limap._scene.HolisticReconstruction, correspondence_graph: pycolmap._core.CorrespondenceGraph) None
limap.sfm.global_triangulate_structure(structure_db_cache: limap._limap._scene.StructureDatabaseCache, reconstruction: limap._limap._scene.HolisticReconstruction, line_options: limap._limap._sfm.GlobalLineTriangulationOptions, group_options: limap._limap._sfm.GlobalGroupTriangulationOptions, ba_options: limap._limap._estimators._bundle_adjustment.StructureBundleAdjustmentOptions | None = None, filter_options: limap::GroupVerificationOptions | None = None, exhaustive_match_neighbors: collections.abc.Mapping[typing.SupportsInt | typing.SupportsIndex, collections.abc.Sequence[typing.SupportsInt | typing.SupportsIndex]]={}) None
class limap.sfm.GlobalStructureTriangulationOptions(line_triangulation: limap._limap._sfm.GlobalLineTriangulationOptions = <factory>, group_triangulation: limap._limap._sfm.GlobalGroupTriangulationOptions = <factory>, ba_options: limap._limap._estimators._bundle_adjustment.StructureBundleAdjustmentOptions | None = <factory>, filter_options: limap._limap._sfm.GroupVerificationOptions | None = <factory>)
__init__(line_triangulation: GlobalLineTriangulationOptions = <factory>, group_triangulation: GlobalGroupTriangulationOptions = <factory>, ba_options: StructureBundleAdjustmentOptions | None = <factory>, filter_options: GroupVerificationOptions | None = <factory>) None
ba_options: StructureBundleAdjustmentOptions | None
filter_options: GroupVerificationOptions | None
group_triangulation: GlobalGroupTriangulationOptions
line_triangulation: GlobalLineTriangulationOptions
limap.sfm.global_structure_triangulation(recon: Reconstruction, structure_db_path: Path, options: GlobalStructureTriangulationOptions, exhaustive_match_neighbors: dict[int, list[int]] | None = None) HolisticReconstruction

Incremental triangulation

The triangulators used inside incremental SfM: structures are extended and re-triangulated as each new image is registered.

class limap.sfm.IncrementalLineTriangulatorOptions
__init__(*args, **kwargs)

Overloaded function.

  1. __init__(self: limap._limap._sfm.IncrementalLineTriangulatorOptions) -> None

  2. __init__(self: limap._limap._sfm.IncrementalLineTriangulatorOptions, kwargs: dict) -> None

  3. __init__(self: limap._limap._sfm.IncrementalLineTriangulatorOptions, **kwargs) -> None

check(self: limap._limap._sfm.IncrementalLineTriangulatorOptions) bool
mergedict(self: object, kwargs: dict) None
summary(self: limap._limap._sfm.IncrementalLineTriangulatorOptions, write_type: bool = False) str
todict(self: limap._limap._sfm.IncrementalLineTriangulatorOptions, recursive: bool = True) dict
property complete_max_reproj_error

4.0)

Type:

(float, default

property complete_max_transitivity
Type:

(int, default

property continue_max_angle_error

2.0)

Type:

(float, default

property create_max_angle_error

2.0)

Type:

(float, default

property exhaustive_match_neighbors

{})

Type:

(dict, default

property fullscore_th

1.0)

Type:

(float, default

property ignore_two_view_tracks

True)

Type:

(bool, default

property iou_threshold

0.1)

Type:

(float, default

property linker2d_options

LineLinker2dOptions(score_th=0.5, th_angle=5.0, th_overlap=0.05, th_smartangle=1.0, th_smartoverlap=0.2, th_perp=2.0, th_innerseg=2.0, use_angle=True, use_overlap=True, use_smartangle=True, use_perp=True, use_innerseg=False))

Type:

(LineLinker2dOptions, default

property linker3d_options

LineLinker3dOptions(score_th=0.5, th_angle=10.0, th_overlap=0.001, th_smartangle=1.0, th_smartoverlap=0.1, th_perp=1.0, th_innerseg=1.0, use_angle=True, use_overlap=True, use_smartangle=True, use_perp=False, use_innerseg=True))

Type:

(LineLinker3dOptions, default

property max_transitivity
Type:

(int, default

property merge_max_angle_error_2d

5.0)

Type:

(float, default

property merge_max_reproj_error

4.0)

Type:

(float, default

property min_angle

1.5)

Type:

(float, default

property min_length_2d

20.0)

Type:

(float, default

property num_threads

-1)

Type:

(int, default

property re_max_angle_error

5.0)

Type:

(float, default

property re_max_trials
Type:

(int, default

property re_min_ratio

0.2)

Type:

(float, default

property scale_inv_th

0.01)

Type:

(float, default

property sensitivity_threshold

70.0)

Type:

(float, default

property use_point_assisted_triangulation

True)

Type:

(bool, default

property use_vp_assisted_triangulation

True)

Type:

(bool, default

property var2d

2.0)

Type:

(float, default

class limap.sfm.IncrementalLineTriangulator
__init__(self: limap._limap._sfm.IncrementalLineTriangulator, structure_correspondence_graph: limap._limap._scene.StructureCorrespondenceGraph, reconstruction: limap._limap._scene.HolisticReconstruction, obs_manager: limap::StructureObservationManager = None) None
add_modified_line3d(self: limap._limap._sfm.IncrementalLineTriangulator, line3d_id: SupportsInt | SupportsIndex) None
clear_modified_lines3d(self: limap._limap._sfm.IncrementalLineTriangulator) None
complete_all_tracks(self: limap._limap._sfm.IncrementalLineTriangulator, options: limap._limap._sfm.IncrementalLineTriangulatorOptions) int
complete_image(self: limap._limap._sfm.IncrementalLineTriangulator, options: limap._limap._sfm.IncrementalLineTriangulatorOptions, image_id: SupportsInt | SupportsIndex) int
complete_tracks(self: limap._limap._sfm.IncrementalLineTriangulator, options: limap._limap._sfm.IncrementalLineTriangulatorOptions, line3d_ids: boost::unordered::unordered_flat_set<unsigned long, std: :hash<unsigned long>, std: :equal_to<unsigned long>, std: :allocator<unsigned long> >) int
get_modified_lines3d(self: limap._limap._sfm.IncrementalLineTriangulator) boost::unordered::unordered_flat_set<unsigned long, std::hash<unsigned long>, std::equal_to<unsigned long>, std::allocator<unsigned long> >
merge_all_tracks(self: limap._limap._sfm.IncrementalLineTriangulator, options: limap._limap._sfm.IncrementalLineTriangulatorOptions) int
merge_tracks(self: limap._limap._sfm.IncrementalLineTriangulator, options: limap._limap._sfm.IncrementalLineTriangulatorOptions, line3d_ids: boost::unordered::unordered_flat_set<unsigned long, std: :hash<unsigned long>, std: :equal_to<unsigned long>, std: :allocator<unsigned long> >) int
retriangulate(self: limap._limap._sfm.IncrementalLineTriangulator, options: limap._limap._sfm.IncrementalLineTriangulatorOptions) int
triangulate_image(self: limap._limap._sfm.IncrementalLineTriangulator, options: limap._limap._sfm.IncrementalLineTriangulatorOptions, image_id: SupportsInt | SupportsIndex) int
limap.sfm.incremental_line_triangulation_pipeline(structure_db_cache: limap._limap._scene.StructureDatabaseCache, reconstruction: limap._limap._scene.HolisticReconstruction, options: limap._limap._sfm.IncrementalLineTriangulatorOptions, ba_options: limap._limap._estimators._bundle_adjustment.PointLineBundleAdjustmentOptions | None = None) None
class limap.sfm.IncrementalGroupTriangulatorOptions
__init__(*args, **kwargs)

Overloaded function.

  1. __init__(self: limap._limap._sfm.IncrementalGroupTriangulatorOptions) -> None

  2. __init__(self: limap._limap._sfm.IncrementalGroupTriangulatorOptions, kwargs: dict) -> None

  3. __init__(self: limap._limap._sfm.IncrementalGroupTriangulatorOptions, **kwargs) -> None

check(self: limap._limap._sfm.IncrementalGroupTriangulatorOptions) bool
mergedict(self: object, kwargs: dict) None
summary(self: limap._limap._sfm.IncrementalGroupTriangulatorOptions, write_type: bool = False) str
todict(self: limap._limap._sfm.IncrementalGroupTriangulatorOptions, recursive: bool = True) dict
property association_filter_min_num_features
Type:

(int, default

property association_filter_reproj_threshold

3.0)

Type:

(float, default

property complete_max_angle_error_vp

5.0)

Type:

(float, default

property complete_max_reproj_error

2.0)

Type:

(float, default

property complete_max_transitivity
Type:

(int, default

property continue_max_angle_error_vp

5.0)

Type:

(float, default

property continue_max_reproj_error

2.0)

Type:

(float, default

property default_reproj_threshold

3.0)

Type:

(float, default

property default_vp_threshold

10.0)

Type:

(float, default

property ignore_two_view_tracks

True)

Type:

(bool, default

property init_ransac_thresh

{})

Type:

(dict, default

property max_transitivity
Type:

(int, default

property merge_max_angle_error_vp

5.0)

Type:

(float, default

property merge_max_error_ratio

2.0)

Type:

(float, default

property merge_max_plane_normal_angle

15.0)

Type:

(float, default

property merge_max_reproj_error

2.0)

Type:

(float, default

property min_active_to_keep_params
Type:

(int, default

property min_num_observations
Type:

(int, default

property min_num_supports_for_association
Type:

(int, default

property surface_dist_mad_factor

3.0)

Type:

(float, default

property verification_filter_outliers

True)

Type:

(bool, default

property verification_min_inlier_ratio

0.5)

Type:

(float, default

property verification_min_num_inliers
Type:

(int, default

property verification_obs_inlier_ratio

0.8)

Type:

(float, default

property verification_threshold

{})

Type:

(dict, default

class limap.sfm.IncrementalGroupTriangulator
__init__(self: limap._limap._sfm.IncrementalGroupTriangulator, structure_correspondence_graph: limap._limap._scene.StructureCorrespondenceGraph, reconstruction: limap._limap._scene.HolisticReconstruction, obs_manager: limap::StructureObservationManager = None) None
add_modified_group3d(self: limap._limap._sfm.IncrementalGroupTriangulator, group3d_id: SupportsInt | SupportsIndex) None
clear_modified_groups3d(self: limap._limap._sfm.IncrementalGroupTriangulator) None
complete_all_tracks(self: limap._limap._sfm.IncrementalGroupTriangulator, options: limap._limap._sfm.IncrementalGroupTriangulatorOptions) int
complete_image(self: limap._limap._sfm.IncrementalGroupTriangulator, options: limap._limap._sfm.IncrementalGroupTriangulatorOptions, image_id: SupportsInt | SupportsIndex) int
complete_tracks(self: limap._limap._sfm.IncrementalGroupTriangulator, options: limap._limap._sfm.IncrementalGroupTriangulatorOptions, group3d_ids: boost::unordered::unordered_flat_set<unsigned long, std: :hash<unsigned long>, std: :equal_to<unsigned long>, std: :allocator<unsigned long> >) int
get_modified_groups3d(self: limap._limap._sfm.IncrementalGroupTriangulator) boost::unordered::unordered_flat_set<unsigned long, std::hash<unsigned long>, std::equal_to<unsigned long>, std::allocator<unsigned long> >
merge_all_tracks(self: limap._limap._sfm.IncrementalGroupTriangulator, options: limap._limap._sfm.IncrementalGroupTriangulatorOptions) int
merge_tracks(self: limap._limap._sfm.IncrementalGroupTriangulator, options: limap._limap._sfm.IncrementalGroupTriangulatorOptions, group3d_ids: boost::unordered::unordered_flat_set<unsigned long, std: :hash<unsigned long>, std: :equal_to<unsigned long>, std: :allocator<unsigned long> >) int
triangulate_image(self: limap._limap._sfm.IncrementalGroupTriangulator, options: limap._limap._sfm.IncrementalGroupTriangulatorOptions, image_id: SupportsInt | SupportsIndex) int
class limap.sfm.IncrementalStructureTriangulatorOptions
__init__(*args, **kwargs)

Overloaded function.

  1. __init__(self: limap._limap._sfm.IncrementalStructureTriangulatorOptions) -> None

  2. __init__(self: limap._limap._sfm.IncrementalStructureTriangulatorOptions, kwargs: dict) -> None

  3. __init__(self: limap._limap._sfm.IncrementalStructureTriangulatorOptions, **kwargs) -> None

check(self: limap._limap._sfm.IncrementalStructureTriangulatorOptions) bool
mergedict(self: object, kwargs: dict) None
summary(self: limap._limap._sfm.IncrementalStructureTriangulatorOptions, write_type: bool = False) str
todict(self: limap._limap._sfm.IncrementalStructureTriangulatorOptions, recursive: bool = True) dict
property complete_tracks

True)

Type:

(bool, default

property group_options

IncrementalGroupTriangulatorOptions(max_transitivity=1, min_num_observations=2, min_num_supports_for_association=2, init_ransac_thresh={}, verification_threshold={}, default_vp_threshold=10.0, default_reproj_threshold=3.0, verification_min_num_inliers=3, verification_min_inlier_ratio=0.5, verification_obs_inlier_ratio=0.8, verification_filter_outliers=True, continue_max_reproj_error=2.0, continue_max_angle_error_vp=5.0, complete_max_reproj_error=2.0, complete_max_angle_error_vp=5.0, complete_max_transitivity=5, merge_max_reproj_error=2.0, merge_max_angle_error_vp=5.0, merge_max_error_ratio=2.0, merge_max_plane_normal_angle=15.0, association_filter_min_num_features=10, association_filter_reproj_threshold=3.0, min_active_to_keep_params=10, surface_dist_mad_factor=3.0, ignore_two_view_tracks=True))

Type:

(IncrementalGroupTriangulatorOptions, default

property line_options

IncrementalLineTriangulatorOptions(max_transitivity=1, exhaustive_match_neighbors={}, use_point_assisted_triangulation=True, use_vp_assisted_triangulation=True, min_length_2d=20.0, iou_threshold=0.1, sensitivity_threshold=70.0, var2d=2.0, fullscore_th=1.0, scale_inv_th=0.01, linker2d_options=LineLinker2dOptions(score_th=0.5, th_angle=5.0, th_overlap=0.05, th_smartangle=1.0, th_smartoverlap=0.2, th_perp=2.0, th_innerseg=2.0, use_angle=True, use_overlap=True, use_smartangle=True, use_perp=True, use_innerseg=False), linker3d_options=LineLinker3dOptions(score_th=0.5, th_angle=10.0, th_overlap=0.001, th_smartangle=1.0, th_smartoverlap=0.1, th_perp=1.0, th_innerseg=1.0, use_angle=True, use_overlap=True, use_smartangle=True, use_perp=False, use_innerseg=True), create_max_angle_error=2.0, continue_max_angle_error=2.0, merge_max_reproj_error=4.0, merge_max_angle_error_2d=5.0, complete_max_reproj_error=4.0, complete_max_transitivity=5, re_max_angle_error=5.0, re_min_ratio=0.2, re_max_trials=1, min_angle=1.5, ignore_two_view_tracks=True, num_threads=-1))

Type:

(IncrementalLineTriangulatorOptions, default

property merge_tracks

True)

Type:

(bool, default

property point_options

IncrementalTriangulatorOptions(max_transitivity=1, create_max_angle_error=2.0, continue_max_angle_error=2.0, merge_max_reproj_error=4.0, complete_max_reproj_error=4.0, complete_max_transitivity=5, re_max_angle_error=5.0, re_min_ratio=0.2, re_max_trials=1, min_angle=1.5, ignore_two_view_tracks=True, min_focal_length_ratio=0.1, max_focal_length_ratio=10.0, max_extra_param=1.0, random_seed=-1))

Type:

(IncrementalTriangulatorOptions, default

property triangulate_groups

True)

Type:

(bool, default

property triangulate_lines

True)

Type:

(bool, default

property triangulate_points

True)

Type:

(bool, default

class limap.sfm.IncrementalStructureTriangulator
__init__(self: limap._limap._sfm.IncrementalStructureTriangulator, point_corr_graph: pycolmap._core.CorrespondenceGraph, structure_corr_graph: limap._limap._scene.StructureCorrespondenceGraph, reconstruction: limap._limap._scene.HolisticReconstruction) None
clear_modified(self: limap._limap._sfm.IncrementalStructureTriangulator) None
complete_all_tracks(self: limap._limap._sfm.IncrementalStructureTriangulator, options: limap._limap._sfm.IncrementalStructureTriangulatorOptions) int
complete_image(self: limap._limap._sfm.IncrementalStructureTriangulator, options: limap._limap._sfm.IncrementalStructureTriangulatorOptions, image_id: SupportsInt | SupportsIndex) int
get_modified_groups3d(self: limap._limap._sfm.IncrementalStructureTriangulator) boost::unordered::unordered_flat_set<unsigned long, std::hash<unsigned long>, std::equal_to<unsigned long>, std::allocator<unsigned long> >
get_modified_lines3d(self: limap._limap._sfm.IncrementalStructureTriangulator) boost::unordered::unordered_flat_set<unsigned long, std::hash<unsigned long>, std::equal_to<unsigned long>, std::allocator<unsigned long> >
get_modified_points3d(self: limap._limap._sfm.IncrementalStructureTriangulator) boost::unordered::unordered_flat_set<unsigned long, std::hash<unsigned long>, std::equal_to<unsigned long>, std::allocator<unsigned long> >
group_triangulator(self: limap._limap._sfm.IncrementalStructureTriangulator) limap._limap._sfm.IncrementalGroupTriangulator
line_triangulator(self: limap._limap._sfm.IncrementalStructureTriangulator) limap._limap._sfm.IncrementalLineTriangulator
merge_all_tracks(self: limap._limap._sfm.IncrementalStructureTriangulator, options: limap._limap._sfm.IncrementalStructureTriangulatorOptions) int
point_triangulator(self: limap._limap._sfm.IncrementalStructureTriangulator) pycolmap._core.IncrementalTriangulator
triangulate_image(self: limap._limap._sfm.IncrementalStructureTriangulator, options: limap._limap._sfm.IncrementalStructureTriangulatorOptions, image_id: SupportsInt | SupportsIndex) int
limap.sfm.incremental_triangulate_structure(point_corr_graph: pycolmap._core.CorrespondenceGraph, structure_db_cache: limap._limap._scene.StructureDatabaseCache, reconstruction: limap._limap._scene.HolisticReconstruction, options: limap._limap._sfm.IncrementalStructureTriangulatorOptions, ba_options: limap._limap._estimators._bundle_adjustment.StructureBundleAdjustmentOptions | None = None, filter_options: limap._limap._sfm.GroupVerificationOptions | None = None) None

Incremental mapper and pipeline

The mapper registers images with hybrid point and line correspondences and keeps the structures up to date; the pipeline drives it from initialization to the final bundle adjustment.

class limap.sfm.StructureIncrementalMapperOptions
__init__(*args, **kwargs)

Overloaded function.

  1. __init__(self: limap._limap._sfm.StructureIncrementalMapperOptions) -> None

  2. __init__(self: limap._limap._sfm.StructureIncrementalMapperOptions, kwargs: dict) -> None

  3. __init__(self: limap._limap._sfm.StructureIncrementalMapperOptions, **kwargs) -> None

check(self: limap._limap._sfm.StructureIncrementalMapperOptions) bool
mergedict(self: object, kwargs: dict) None
summary(self: limap._limap._sfm.StructureIncrementalMapperOptions, write_type: bool = False) str
todict(self: limap._limap._sfm.StructureIncrementalMapperOptions, recursive: bool = True) dict
property filter_max_line_angular_error

8.0)

Type:

Max angular error (degrees) for line filtering (float, default

property filter_max_line_perp_error

5.0)

Type:

Max perpendicular error (pixels) for line filtering (float, default

property group_verification

GroupVerificationOptions(inlier_threshold=-1.0, default_vp_threshold=10.0, default_reproj_threshold=3.0, min_num_inliers=3, min_inlier_ratio=0.5, obs_inlier_ratio=0.8, filter_outliers=True))

Type:

Post-BA group verification options (GroupVerificationOptions, default

property line_visibility_weight

1.0)

Type:

Weight for line visibility in next-image ranking (float, default

property min_active_line_observations
Type:

Min active observations for reliable classification (int, default

property min_active_ratio_for_deletion

0.2)

Type:

Min active ratio before hard-deleting a line track (float, default

property pixel_uncertainty_threshold

30.0)

Type:

Covariance-based pixel uncertainty (std dev) threshold for reliability classification (0 to disable) (float, default

property registration

PointLineAbsolutePoseOptions(max_error_point=12.0, max_error_line=12.0, weight_point=1.0, weight_line=1.0, max_iterations=10000, min_iterations=100, success_prob=0.9999, random_seed=True, seed=0, estimate_focal_length=False))

Type:

Point-line absolute pose estimation options (PointLineAbsolutePoseOptions, default

property structure_ba

StructureBundleAdjustmentOptions(refine_wireframe=True, weight_wireframe=0.1, loss_function_type_wireframe=LossFunctionType.CAUCHY, loss_function_scale_wireframe=1.0, force_reconstruct_wireframe3d=True, wireframe_voting=<limap._limap._scene.WireframeVotingOptions object at 0x7e10ca32e8b0>, refine_groups=True, weight_vp=5000.0, weight_plane=0.5, vp_residual_type=’sin’, loss_function_type_angle=LossFunctionType.CAUCHY, loss_function_scale_angle=0.2, loss_function_type_reprojection=LossFunctionType.CAUCHY, loss_function_scale_reprojection=1.5, min_active_group_associations=10, min_reliable_group_associations_step2=20, angular_constraint_threshold_deg=5.0, angular_constraint_min_covisible_images=3, loss_function_type_angular_constraint=LossFunctionType.CAUCHY, loss_function_scale_angular_constraint=0.1, enforce_vp_angular_constraints=True, weight_vp_angular_constraint=100000.0, enforce_plane_angular_constraints=True, weight_plane_angular_constraint=100000.0, refine_points=True, refine_lines=True, weight_point=1.0, weight_line=1.0, line_weight_normalization_length=60.0, loss_function_type_line=LossFunctionType.CAUCHY, loss_function_scale_line=1.0, use_parameter_block_ordering=True, refine_focal_length=True, refine_principal_point=False, refine_extra_params=True, refine_rig_from_world=True, refine_sensor_from_rig=True, constant_rig_from_world_rotation=False, refine_points3D=True, min_track_length=0, print_summary=True, backend=BundleAdjustmentBackend.CERES, ceres=CeresBundleAdjustmentOptions(loss_function_type=LossFunctionType.TRIVIAL, loss_function_scale=1.0, use_gpu=False, gpu_index=’-1’, solver_options=SolverOptions(minimizer_type=MinimizerType.TRUST_REGION, line_search_direction_type=LineSearchDirectionType.LBFGS, line_search_type=LineSearchType.WOLFE, nonlinear_conjugate_gradient_type=NonlinearConjugateGradientType.FLETCHER_REEVES, max_lbfgs_rank=20, use_approximate_eigenvalue_bfgs_scaling=False, line_search_interpolation_type=LineSearchInterpolationType.CUBIC, min_line_search_step_size=1e-09, line_search_sufficient_function_decrease=0.0001, max_line_search_step_contraction=0.001, min_line_search_step_contraction=0.6, max_num_line_search_step_size_iterations=20, max_num_line_search_direction_restarts=5, line_search_sufficient_curvature_decrease=0.9, max_line_search_step_expansion=10.0, trust_region_strategy_type=TrustRegionStrategyType.LEVENBERG_MARQUARDT, dogleg_type=DoglegType.TRADITIONAL_DOGLEG, use_nonmonotonic_steps=False, max_consecutive_nonmonotonic_steps=10, max_num_iterations=100, max_solver_time_in_seconds=1000000000.0, num_threads=-1, initial_trust_region_radius=10000.0, max_trust_region_radius=1e+16, min_trust_region_radius=1e-32, min_relative_decrease=0.001, min_lm_diagonal=1e-06, max_lm_diagonal=1e+32, max_num_consecutive_invalid_steps=10, function_tolerance=0.0, gradient_tolerance=0.0001, parameter_tolerance=0.0, linear_solver_type=LinearSolverType.SPARSE_SCHUR, preconditioner_type=PreconditionerType.JACOBI, visibility_clustering_type=VisibilityClusteringType.CANONICAL_VIEWS, dense_linear_algebra_library_type=DenseLinearAlgebraLibraryType.EIGEN, sparse_linear_algebra_library_type=SparseLinearAlgebraLibraryType.SUITE_SPARSE, use_explicit_schur_complement=False, dynamic_sparsity=False, use_inner_iterations=False, inner_iteration_tolerance=0.001, min_linear_solver_iterations=0, max_linear_solver_iterations=200, eta=0.1, jacobi_scaling=True, logging_type=LoggingType.SILENT, minimizer_progress_to_stdout=False, trust_region_problem_dump_directory=’/tmp’, trust_region_problem_dump_format_type=DumpFormatType.TEXTFILE, check_gradients=False, gradient_check_relative_precision=1e-08, gradient_check_numeric_derivative_relative_step_size=1e-06, update_state_every_iteration=False), min_num_images_gpu_solver=50, min_num_residuals_for_cpu_multi_threading=50000, max_num_images_direct_dense_cpu_solver=50, max_num_images_direct_sparse_cpu_solver=1000, max_num_images_direct_dense_gpu_solver=200, max_num_images_direct_sparse_gpu_solver=4000, auto_select_solver_type=False), caspar=CasparBundleAdjustmentOptions(solver_iter_max=200, pcg_iter_max=20, diag_init=1.0, diag_min=1e-12, diag_scaling_up=2.0, diag_scaling_down=0.333333, diag_exit_value=1000.0, score_exit_value=0.0, pcg_rel_error_exit=0.0001, pcg_rel_score_exit=-1.0, pcg_rel_decrease_min=-1.0, solver_rel_decrease_min=1.0, gpu_index=’-1’)))

Type:

Structure bundle adjustment options (StructureBundleAdjustmentOptions, default

property triangulation

IncrementalStructureTriangulatorOptions(triangulate_points=True, triangulate_lines=True, triangulate_groups=True, complete_tracks=True, merge_tracks=True, point_options=IncrementalTriangulatorOptions(max_transitivity=1, create_max_angle_error=2.0, continue_max_angle_error=2.0, merge_max_reproj_error=4.0, complete_max_reproj_error=4.0, complete_max_transitivity=5, re_max_angle_error=5.0, re_min_ratio=0.2, re_max_trials=1, min_angle=1.5, ignore_two_view_tracks=True, min_focal_length_ratio=0.1, max_focal_length_ratio=10.0, max_extra_param=1.0, random_seed=-1), line_options=IncrementalLineTriangulatorOptions(max_transitivity=1, exhaustive_match_neighbors={}, use_point_assisted_triangulation=True, use_vp_assisted_triangulation=True, min_length_2d=20.0, iou_threshold=0.1, sensitivity_threshold=70.0, var2d=2.0, fullscore_th=1.0, scale_inv_th=0.01, linker2d_options=LineLinker2dOptions(score_th=0.5, th_angle=5.0, th_overlap=0.05, th_smartangle=1.0, th_smartoverlap=0.2, th_perp=2.0, th_innerseg=2.0, use_angle=True, use_overlap=True, use_smartangle=True, use_perp=True, use_innerseg=False), linker3d_options=LineLinker3dOptions(score_th=0.5, th_angle=10.0, th_overlap=0.001, th_smartangle=1.0, th_smartoverlap=0.1, th_perp=1.0, th_innerseg=1.0, use_angle=True, use_overlap=True, use_smartangle=True, use_perp=False, use_innerseg=True), create_max_angle_error=2.0, continue_max_angle_error=2.0, merge_max_reproj_error=4.0, merge_max_angle_error_2d=5.0, complete_max_reproj_error=4.0, complete_max_transitivity=5, re_max_angle_error=5.0, re_min_ratio=0.2, re_max_trials=1, min_angle=1.5, ignore_two_view_tracks=True, num_threads=-1), group_options=IncrementalGroupTriangulatorOptions(max_transitivity=1, min_num_observations=2, min_num_supports_for_association=2, init_ransac_thresh={}, verification_threshold={}, default_vp_threshold=10.0, default_reproj_threshold=3.0, verification_min_num_inliers=3, verification_min_inlier_ratio=0.5, verification_obs_inlier_ratio=0.8, verification_filter_outliers=True, continue_max_reproj_error=2.0, continue_max_angle_error_vp=5.0, complete_max_reproj_error=2.0, complete_max_angle_error_vp=5.0, complete_max_transitivity=5, merge_max_reproj_error=2.0, merge_max_angle_error_vp=5.0, merge_max_error_ratio=2.0, merge_max_plane_normal_angle=15.0, association_filter_min_num_features=10, association_filter_reproj_threshold=3.0, min_active_to_keep_params=10, surface_dist_mad_factor=3.0, ignore_two_view_tracks=True)))

Type:

Structure triangulation options (IncrementalStructureTriangulatorOptions, default

property use_lines_for_registration

True)

Type:

Whether to use lines for hybrid PnPL registration (bool, default

property use_two_step_ba

True)

Type:

Enable 2-step BA (reliable then unreliable lines) (bool, default

class limap.sfm.StructureIncrementalMapper
__init__(self: limap._limap._sfm.StructureIncrementalMapper, database_cache: pycolmap._core.DatabaseCache, structure_db_cache: limap._limap._scene.StructureDatabaseCache) None
adjust_global_bundle(self: limap._limap._sfm.StructureIncrementalMapper, mapper_options: pycolmap._core.IncrementalMapperOptions, options: limap._limap._sfm.StructureIncrementalMapperOptions) bool
adjust_local_bundle(self: limap._limap._sfm.StructureIncrementalMapper, mapper_options: pycolmap._core.IncrementalMapperOptions, options: limap._limap._sfm.StructureIncrementalMapperOptions, image_id: SupportsInt | SupportsIndex) limap._limap._sfm.StructureLocalBundleAdjustmentReport
begin_reconstruction(self: limap._limap._sfm.StructureIncrementalMapper, reconstruction: limap._limap._scene.HolisticReconstruction) None
colmap_mapper(self: limap._limap._sfm.StructureIncrementalMapper) pycolmap._core.IncrementalMapper
complete_and_merge_tracks(self: limap._limap._sfm.StructureIncrementalMapper, options: limap._limap._sfm.StructureIncrementalMapperOptions) int
end_reconstruction(self: limap._limap._sfm.StructureIncrementalMapper, discard: bool) None
estimate_initial_two_view_geometry(self: limap._limap._sfm.StructureIncrementalMapper, options: pycolmap._core.IncrementalMapperOptions, image_id1: SupportsInt | SupportsIndex, image_id2: SupportsInt | SupportsIndex) pycolmap._core.Rigid3d | None
filter_frames(self: limap._limap._sfm.StructureIncrementalMapper, options: pycolmap._core.IncrementalMapperOptions) int
filter_points(self: limap._limap._sfm.StructureIncrementalMapper, options: pycolmap._core.IncrementalMapperOptions) int
find_initial_image_pair(self: limap._limap._sfm.StructureIncrementalMapper, options: pycolmap._core.IncrementalMapperOptions) tuple[int, int, pycolmap._core.Rigid3d] | None
find_next_images(self: limap._limap._sfm.StructureIncrementalMapper, options: pycolmap._core.IncrementalMapperOptions, structure_options: limap._limap._sfm.StructureIncrementalMapperOptions, structure_less: bool = False) list[int]
iterative_global_refinement(self: limap._limap._sfm.StructureIncrementalMapper, max_num_refinements: SupportsInt | SupportsIndex, max_refinement_change: SupportsFloat | SupportsIndex, mapper_options: pycolmap._core.IncrementalMapperOptions, options: limap._limap._sfm.StructureIncrementalMapperOptions, normalize_reconstruction: bool = True) None
iterative_local_refinement(self: limap._limap._sfm.StructureIncrementalMapper, max_num_refinements: SupportsInt | SupportsIndex, max_refinement_change: SupportsFloat | SupportsIndex, mapper_options: pycolmap._core.IncrementalMapperOptions, options: limap._limap._sfm.StructureIncrementalMapperOptions, image_id: SupportsInt | SupportsIndex) None
register_initial_image_pair(self: limap._limap._sfm.StructureIncrementalMapper, options: pycolmap._core.IncrementalMapperOptions, image_id1: SupportsInt | SupportsIndex, image_id2: SupportsInt | SupportsIndex, cam2_from_cam1: pycolmap._core.Rigid3d) None
register_next_image(self: limap._limap._sfm.StructureIncrementalMapper, mapper_options: pycolmap._core.IncrementalMapperOptions, options: limap._limap._sfm.StructureIncrementalMapperOptions, image_id: SupportsInt | SupportsIndex) bool
register_next_structure_less_image(self: limap._limap._sfm.StructureIncrementalMapper, mapper_options: pycolmap._core.IncrementalMapperOptions, image_id: SupportsInt | SupportsIndex) bool
reset_initialization_stats(self: limap._limap._sfm.StructureIncrementalMapper) None
retriangulate(self: limap._limap._sfm.StructureIncrementalMapper, options: limap._limap._sfm.StructureIncrementalMapperOptions) int
soft_filter_lines(self: limap._limap._sfm.StructureIncrementalMapper, options: limap._limap._sfm.StructureIncrementalMapperOptions) int

Soft filter: tag observations as inactive instead of deleting

structure_triangulator(self: limap._limap._sfm.StructureIncrementalMapper) limap._limap._sfm.IncrementalStructureTriangulator
triangulate_image(self: limap._limap._sfm.StructureIncrementalMapper, options: limap._limap._sfm.StructureIncrementalMapperOptions, image_id: SupportsInt | SupportsIndex) int
property num_shared_reg_images
property num_total_reg_images
property reconstruction
class limap.sfm.StructureIncrementalPipelineOptions
__init__(*args, **kwargs)

Overloaded function.

  1. __init__(self: limap._limap._sfm.StructureIncrementalPipelineOptions) -> None

  2. __init__(self: limap._limap._sfm.StructureIncrementalPipelineOptions, kwargs: dict) -> None

  3. __init__(self: limap._limap._sfm.StructureIncrementalPipelineOptions, **kwargs) -> None

check(self: limap._limap._sfm.StructureIncrementalPipelineOptions) bool
global_structure_ba(self: limap._limap._sfm.StructureIncrementalPipelineOptions) limap._limap._estimators._bundle_adjustment.StructureBundleAdjustmentOptions
is_initial_pair_provided(self: limap._limap._sfm.StructureIncrementalPipelineOptions) bool
local_structure_ba(self: limap._limap._sfm.StructureIncrementalPipelineOptions) limap._limap._estimators._bundle_adjustment.StructureBundleAdjustmentOptions
mapper(self: limap._limap._sfm.StructureIncrementalPipelineOptions) pycolmap._core.IncrementalMapperOptions
mergedict(self: object, kwargs: dict) None
summary(self: limap._limap._sfm.StructureIncrementalPipelineOptions, write_type: bool = False) str
todict(self: limap._limap._sfm.StructureIncrementalPipelineOptions, recursive: bool = True) dict
property colmap_options

IncrementalPipelineOptions(min_num_matches=15, ignore_watermarks=False, multiple_models=True, max_num_models=50, max_model_overlap=20, min_model_size=10, init_image_id1=-1, init_image_id2=-1, init_num_trials=200, structure_less_registration_fallback=True, structure_less_registration_only=False, extract_colors=True, num_threads=-1, random_seed=-1, min_focal_length_ratio=0.1, max_focal_length_ratio=10.0, max_extra_param=1.0, ba_refine_focal_length=True, ba_refine_principal_point=False, ba_refine_extra_params=True, ba_refine_sensor_from_rig=True, ba_min_num_residuals_for_cpu_multi_threading=50000, ba_local_function_tolerance=0.0, ba_local_max_num_iterations=-1, ba_global_frames_ratio=1.1, ba_global_points_ratio=1.1, ba_global_frames_freq=500, ba_global_points_freq=250000, ba_global_function_tolerance=0.0, ba_global_max_num_iterations=-1, ba_local_max_refinements=2, ba_local_max_refinement_change=0.001, ba_global_max_refinements=5, ba_global_max_refinement_change=0.0005, ba_use_gpu=False, ba_gpu_index=’-1’, ba_local_backend=BundleAdjustmentBackend.CERES, ba_global_backend=BundleAdjustmentBackend.CERES, use_prior_position=False, use_robust_loss_on_prior_position=False, prior_position_loss_scale=7.815, snapshot_path=., snapshot_frames_freq=0, image_path=., image_names=[], load_all_images=False, fix_existing_frames=False, constant_rigs=set(), constant_cameras=set(), max_runtime_seconds=-1, mapper=IncrementalMapperOptions(init_min_num_inliers=100, init_max_error=4.0, init_max_forward_motion=0.95, init_min_tri_angle=16.0, init_max_reg_trials=2, abs_pose_max_error=12.0, abs_pose_min_num_inliers=30, abs_pose_min_inlier_ratio=0.25, abs_pose_refine_focal_length=True, abs_pose_refine_extra_params=True, ba_local_num_images=6, ba_local_min_tri_angle=6.0, ba_global_ignore_redundant_points3D=False, ba_global_prune_points_min_coverage_gain=0.05, min_focal_length_ratio=0.1, max_focal_length_ratio=10.0, max_extra_param=1.0, filter_max_reproj_error=4.0, filter_min_tri_angle=1.5, max_reg_trials=3, fix_existing_frames=False, constant_rigs=set(), constant_cameras=set(), num_threads=-1, random_seed=-1, image_selection_method=ImageSelectionMethod.MIN_UNCERTAINTY), triangulation=IncrementalTriangulatorOptions(max_transitivity=1, create_max_angle_error=2.0, continue_max_angle_error=2.0, merge_max_reproj_error=4.0, complete_max_reproj_error=4.0, complete_max_transitivity=5, re_max_angle_error=5.0, re_min_ratio=0.2, re_max_trials=1, min_angle=1.5, ignore_two_view_tracks=True, min_focal_length_ratio=0.1, max_focal_length_ratio=10.0, max_extra_param=1.0, random_seed=-1)))

Type:

COLMAP pipeline options (IncrementalPipelineOptions, default

property structure_options

StructureIncrementalMapperOptions(line_visibility_weight=1.0, use_lines_for_registration=True, registration=PointLineAbsolutePoseOptions(max_error_point=12.0, max_error_line=12.0, weight_point=1.0, weight_line=1.0, max_iterations=10000, min_iterations=100, success_prob=0.9999, random_seed=True, seed=0, estimate_focal_length=False), triangulation=IncrementalStructureTriangulatorOptions(triangulate_points=True, triangulate_lines=True, triangulate_groups=True, complete_tracks=True, merge_tracks=True, point_options=IncrementalTriangulatorOptions(max_transitivity=1, create_max_angle_error=2.0, continue_max_angle_error=2.0, merge_max_reproj_error=4.0, complete_max_reproj_error=4.0, complete_max_transitivity=5, re_max_angle_error=5.0, re_min_ratio=0.2, re_max_trials=1, min_angle=1.5, ignore_two_view_tracks=True, min_focal_length_ratio=0.1, max_focal_length_ratio=10.0, max_extra_param=1.0, random_seed=-1), line_options=IncrementalLineTriangulatorOptions(max_transitivity=1, exhaustive_match_neighbors={}, use_point_assisted_triangulation=True, use_vp_assisted_triangulation=True, min_length_2d=20.0, iou_threshold=0.1, sensitivity_threshold=70.0, var2d=2.0, fullscore_th=1.0, scale_inv_th=0.01, linker2d_options=LineLinker2dOptions(score_th=0.5, th_angle=5.0, th_overlap=0.05, th_smartangle=1.0, th_smartoverlap=0.2, th_perp=2.0, th_innerseg=2.0, use_angle=True, use_overlap=True, use_smartangle=True, use_perp=True, use_innerseg=False), linker3d_options=LineLinker3dOptions(score_th=0.5, th_angle=10.0, th_overlap=0.001, th_smartangle=1.0, th_smartoverlap=0.1, th_perp=1.0, th_innerseg=1.0, use_angle=True, use_overlap=True, use_smartangle=True, use_perp=False, use_innerseg=True), create_max_angle_error=2.0, continue_max_angle_error=2.0, merge_max_reproj_error=4.0, merge_max_angle_error_2d=5.0, complete_max_reproj_error=4.0, complete_max_transitivity=5, re_max_angle_error=5.0, re_min_ratio=0.2, re_max_trials=1, min_angle=1.5, ignore_two_view_tracks=True, num_threads=-1), group_options=IncrementalGroupTriangulatorOptions(max_transitivity=1, min_num_observations=2, min_num_supports_for_association=2, init_ransac_thresh={}, verification_threshold={}, default_vp_threshold=10.0, default_reproj_threshold=3.0, verification_min_num_inliers=3, verification_min_inlier_ratio=0.5, verification_obs_inlier_ratio=0.8, verification_filter_outliers=True, continue_max_reproj_error=2.0, continue_max_angle_error_vp=5.0, complete_max_reproj_error=2.0, complete_max_angle_error_vp=5.0, complete_max_transitivity=5, merge_max_reproj_error=2.0, merge_max_angle_error_vp=5.0, merge_max_error_ratio=2.0, merge_max_plane_normal_angle=15.0, association_filter_min_num_features=10, association_filter_reproj_threshold=3.0, min_active_to_keep_params=10, surface_dist_mad_factor=3.0, ignore_two_view_tracks=True)), structure_ba=StructureBundleAdjustmentOptions(refine_wireframe=True, weight_wireframe=0.1, loss_function_type_wireframe=LossFunctionType.CAUCHY, loss_function_scale_wireframe=1.0, force_reconstruct_wireframe3d=True, wireframe_voting=<limap._limap._scene.WireframeVotingOptions object at 0x7e10ca32e8b0>, refine_groups=True, weight_vp=5000.0, weight_plane=0.5, vp_residual_type=’sin’, loss_function_type_angle=LossFunctionType.CAUCHY, loss_function_scale_angle=0.2, loss_function_type_reprojection=LossFunctionType.CAUCHY, loss_function_scale_reprojection=1.5, min_active_group_associations=10, min_reliable_group_associations_step2=20, angular_constraint_threshold_deg=5.0, angular_constraint_min_covisible_images=3, loss_function_type_angular_constraint=LossFunctionType.CAUCHY, loss_function_scale_angular_constraint=0.1, enforce_vp_angular_constraints=True, weight_vp_angular_constraint=100000.0, enforce_plane_angular_constraints=True, weight_plane_angular_constraint=100000.0, refine_points=True, refine_lines=True, weight_point=1.0, weight_line=1.0, line_weight_normalization_length=60.0, loss_function_type_line=LossFunctionType.CAUCHY, loss_function_scale_line=1.0, use_parameter_block_ordering=True, refine_focal_length=True, refine_principal_point=False, refine_extra_params=True, refine_rig_from_world=True, refine_sensor_from_rig=True, constant_rig_from_world_rotation=False, refine_points3D=True, min_track_length=0, print_summary=True, backend=BundleAdjustmentBackend.CERES, ceres=CeresBundleAdjustmentOptions(loss_function_type=LossFunctionType.TRIVIAL, loss_function_scale=1.0, use_gpu=False, gpu_index=’-1’, solver_options=SolverOptions(minimizer_type=MinimizerType.TRUST_REGION, line_search_direction_type=LineSearchDirectionType.LBFGS, line_search_type=LineSearchType.WOLFE, nonlinear_conjugate_gradient_type=NonlinearConjugateGradientType.FLETCHER_REEVES, max_lbfgs_rank=20, use_approximate_eigenvalue_bfgs_scaling=False, line_search_interpolation_type=LineSearchInterpolationType.CUBIC, min_line_search_step_size=1e-09, line_search_sufficient_function_decrease=0.0001, max_line_search_step_contraction=0.001, min_line_search_step_contraction=0.6, max_num_line_search_step_size_iterations=20, max_num_line_search_direction_restarts=5, line_search_sufficient_curvature_decrease=0.9, max_line_search_step_expansion=10.0, trust_region_strategy_type=TrustRegionStrategyType.LEVENBERG_MARQUARDT, dogleg_type=DoglegType.TRADITIONAL_DOGLEG, use_nonmonotonic_steps=False, max_consecutive_nonmonotonic_steps=10, max_num_iterations=100, max_solver_time_in_seconds=1000000000.0, num_threads=-1, initial_trust_region_radius=10000.0, max_trust_region_radius=1e+16, min_trust_region_radius=1e-32, min_relative_decrease=0.001, min_lm_diagonal=1e-06, max_lm_diagonal=1e+32, max_num_consecutive_invalid_steps=10, function_tolerance=0.0, gradient_tolerance=0.0001, parameter_tolerance=0.0, linear_solver_type=LinearSolverType.SPARSE_SCHUR, preconditioner_type=PreconditionerType.JACOBI, visibility_clustering_type=VisibilityClusteringType.CANONICAL_VIEWS, dense_linear_algebra_library_type=DenseLinearAlgebraLibraryType.EIGEN, sparse_linear_algebra_library_type=SparseLinearAlgebraLibraryType.SUITE_SPARSE, use_explicit_schur_complement=False, dynamic_sparsity=False, use_inner_iterations=False, inner_iteration_tolerance=0.001, min_linear_solver_iterations=0, max_linear_solver_iterations=200, eta=0.1, jacobi_scaling=True, logging_type=LoggingType.SILENT, minimizer_progress_to_stdout=False, trust_region_problem_dump_directory=’/tmp’, trust_region_problem_dump_format_type=DumpFormatType.TEXTFILE, check_gradients=False, gradient_check_relative_precision=1e-08, gradient_check_numeric_derivative_relative_step_size=1e-06, update_state_every_iteration=False), min_num_images_gpu_solver=50, min_num_residuals_for_cpu_multi_threading=50000, max_num_images_direct_dense_cpu_solver=50, max_num_images_direct_sparse_cpu_solver=1000, max_num_images_direct_dense_gpu_solver=200, max_num_images_direct_sparse_gpu_solver=4000, auto_select_solver_type=False), caspar=CasparBundleAdjustmentOptions(solver_iter_max=200, pcg_iter_max=20, diag_init=1.0, diag_min=1e-12, diag_scaling_up=2.0, diag_scaling_down=0.333333, diag_exit_value=1000.0, score_exit_value=0.0, pcg_rel_error_exit=0.0001, pcg_rel_score_exit=-1.0, pcg_rel_decrease_min=-1.0, solver_rel_decrease_min=1.0, gpu_index=’-1’)), filter_max_line_angular_error=8.0, filter_max_line_perp_error=5.0, group_verification=GroupVerificationOptions(inlier_threshold=-1.0, default_vp_threshold=10.0, default_reproj_threshold=3.0, min_num_inliers=3, min_inlier_ratio=0.5, obs_inlier_ratio=0.8, filter_outliers=True), use_two_step_ba=True, min_active_line_observations=4, min_active_ratio_for_deletion=0.2, pixel_uncertainty_threshold=30.0))

Type:

Structure mapper options (StructureIncrementalMapperOptions, default

class limap.sfm.StructureIncrementalPipeline
__init__(self: limap._limap._sfm.StructureIncrementalPipeline, options: limap._limap._sfm.StructureIncrementalPipelineOptions, database_cache: pycolmap._core.DatabaseCache, structure_db_cache: limap._limap._scene.StructureDatabaseCache, reconstruction_manager: limap._limap._scene.HolisticReconstructionManager) None
check_run_global_refinement(self: limap._limap._sfm.StructureIncrementalPipeline, reconstruction: limap._limap._scene.HolisticReconstruction, ba_prev_num_reg_frames: SupportsInt | SupportsIndex, ba_prev_num_points: SupportsInt | SupportsIndex) bool
initialize_reconstruction(self: limap._limap._sfm.StructureIncrementalPipeline, mapper: limap._limap._sfm.StructureIncrementalMapper, mapper_options: pycolmap._core.IncrementalMapperOptions, reconstruction: limap._limap._scene.HolisticReconstruction) limap._limap._sfm.StructureIncrementalPipelineStatus
reconstruct(self: limap._limap._sfm.StructureIncrementalPipeline, mapper: limap._limap._sfm.StructureIncrementalMapper, mapper_options: pycolmap._core.IncrementalMapperOptions, continue_reconstruction: bool, initial_image_pair_callback: collections.abc.Callable[[], None] = None, next_image_callback: collections.abc.Callable[[], None] = None) limap._limap._sfm.StructureIncrementalPipelineStatus
reconstruct_sub_model(self: limap._limap._sfm.StructureIncrementalPipeline, mapper: limap._limap._sfm.StructureIncrementalMapper, mapper_options: pycolmap._core.IncrementalMapperOptions, reconstruction: limap._limap._scene.HolisticReconstruction, initial_image_pair_callback: collections.abc.Callable[[], None] = None, next_image_callback: collections.abc.Callable[[], None] = None) limap._limap._sfm.StructureIncrementalPipelineStatus
run(self: limap._limap._sfm.StructureIncrementalPipeline, initial_image_pair_callback: collections.abc.Callable[[], None] = None, next_image_callback: collections.abc.Callable[[], None] = None) None
property options
property reconstruction_manager
class limap.sfm.StructureIncrementalPipelineStatus

Members:

SUCCESS

INTERRUPTED

CONTINUE

STOP

NO_INITIAL_PAIR

BAD_INITIAL_PAIR

__init__(self: limap._limap._sfm.StructureIncrementalPipelineStatus, value: SupportsInt | SupportsIndex) None
BAD_INITIAL_PAIR = <StructureIncrementalPipelineStatus.BAD_INITIAL_PAIR: 5>
CONTINUE = <StructureIncrementalPipelineStatus.CONTINUE: 2>
INTERRUPTED = <StructureIncrementalPipelineStatus.INTERRUPTED: 1>
NO_INITIAL_PAIR = <StructureIncrementalPipelineStatus.NO_INITIAL_PAIR: 4>
STOP = <StructureIncrementalPipelineStatus.STOP: 3>
SUCCESS = <StructureIncrementalPipelineStatus.SUCCESS: 0>
StructureIncrementalPipelineStatus.name -> str
property value
class limap.sfm.StructureLocalBundleAdjustmentReport
__init__(*args, **kwargs)

Overloaded function.

  1. __init__(self: limap._limap._sfm.StructureLocalBundleAdjustmentReport) -> None

  2. __init__(self: limap._limap._sfm.StructureLocalBundleAdjustmentReport, kwargs: dict) -> None

  3. __init__(self: limap._limap._sfm.StructureLocalBundleAdjustmentReport, **kwargs) -> None

mergedict(self: object, kwargs: dict) None
summary(self: limap._limap._sfm.StructureLocalBundleAdjustmentReport, write_type: bool = False) str
todict(self: limap._limap._sfm.StructureLocalBundleAdjustmentReport, recursive: bool = True) dict
property num_adjusted_observations
Type:

(int, default

property num_completed_group_observations
Type:

(int, default

property num_completed_line_observations
Type:

(int, default

property num_completed_observations
Type:

(int, default

property num_filtered_observations
Type:

(int, default

property num_merged_group_observations
Type:

(int, default

property num_merged_line_observations
Type:

(int, default

property num_merged_observations
Type:

(int, default

class limap.sfm.StructureObservationManager
__init__(self: limap._limap._sfm.StructureObservationManager, structure_reconstruction: limap._limap._scene.StructureReconstruction) None
add_group3d(self: limap._limap._sfm.StructureObservationManager, group3d: limap._limap._scene.Group3d) int

Add a new 3D group with its track. Returns the new group3D_id.

add_group_observation(self: limap._limap._sfm.StructureObservationManager, group3D_id: SupportsInt | SupportsIndex, track_element: pycolmap._core.TrackElement) None

Add a group observation to an existing 3D group.

add_line3d(self: limap._limap._sfm.StructureObservationManager, line3d: limap._limap._geometry.Line3d) int

Add a new 3D line with its track. Returns the new line3D_id.

add_line_observation(self: limap._limap._sfm.StructureObservationManager, line3D_id: SupportsInt | SupportsIndex, track_element: pycolmap._core.TrackElement) None

Add a line observation to an existing 3D line.

classify_line_tracks(self: limap._limap._sfm.StructureObservationManager, min_active_observations: SupportsInt | SupportsIndex) tuple[boost::unordered::unordered_flat_set<unsigned long, std::hash<unsigned long>, std::equal_to<unsigned long>, std::allocator<unsigned long> >, boost::unordered::unordered_flat_set<unsigned long, std::hash<unsigned long>, std::equal_to<unsigned long>, std::allocator<unsigned long> >]

Classify line tracks into (reliable, unreliable) sets.

delete_group3d(self: limap._limap._sfm.StructureObservationManager, group3D_id: SupportsInt | SupportsIndex) None

Delete a 3D group and clear all its 2D->3D assignments.

delete_group_observation(self: limap._limap._sfm.StructureObservationManager, image_id: SupportsInt | SupportsIndex, group2D_idx: SupportsInt | SupportsIndex) None

Delete a group observation from its associated 3D group.

delete_line3d(self: limap._limap._sfm.StructureObservationManager, line3D_id: SupportsInt | SupportsIndex) None

Delete a 3D line and clear all its 2D->3D assignments.

delete_line_observation(self: limap._limap._sfm.StructureObservationManager, image_id: SupportsInt | SupportsIndex, line2D_idx: SupportsInt | SupportsIndex) None

Delete a line observation from its associated 3D line.

delete_supportless_line_tracks(self: limap._limap._sfm.StructureObservationManager, min_active_ratio: SupportsFloat | SupportsIndex) int

Hard-delete tracks with active ratio below threshold. Returns number of deleted tracks.

deregister_frame(self: limap._limap._sfm.StructureObservationManager, frame_id: SupportsInt | SupportsIndex) None

Remove all structure observations (lines + groups) for a frame.

filter_all_lines3d(self: limap._limap._sfm.StructureObservationManager, max_angular_error: SupportsFloat | SupportsIndex, max_perp_error: SupportsFloat | SupportsIndex) int

Filter line observations by reprojection error. Returns the number of filtered observations.

filter_lines3d_by_min_visible_views(self: limap._limap._sfm.StructureObservationManager, min_visible_views: SupportsInt | SupportsIndex) None
filter_lines3d_by_overlap(self: limap._limap._sfm.StructureObservationManager, th_overlap: SupportsFloat | SupportsIndex, min_support_ns: SupportsInt | SupportsIndex) None
filter_lines3d_by_reprojection(self: limap._limap._sfm.StructureObservationManager, th_angular_2d: SupportsFloat | SupportsIndex, th_perp_2d: SupportsFloat | SupportsIndex, num_outliers: SupportsInt | SupportsIndex = 2) None
filter_lines3d_by_sensitivity(self: limap._limap._sfm.StructureObservationManager, th_sensitivity_3d: SupportsFloat | SupportsIndex, min_support_ns: SupportsInt | SupportsIndex) None
is_reliable_track(self: limap._limap._sfm.StructureObservationManager, line3D_id: SupportsInt | SupportsIndex, min_active: SupportsInt | SupportsIndex = 1) bool

Check if a line track is reliable (enough active observations).

merge_groups3d(self: limap._limap._sfm.StructureObservationManager, group3D_id1: SupportsInt | SupportsIndex, group3D_id2: SupportsInt | SupportsIndex) int

Merge two 3D groups into one. Returns the ID of the merged group.

merge_lines3d(self: limap._limap._sfm.StructureObservationManager, line3D_id1: SupportsInt | SupportsIndex, line3D_id2: SupportsInt | SupportsIndex) int

Merge two 3D lines into one. Returns the ID of the merged line.

update_active_supports(self: limap._limap._sfm.StructureObservationManager, max_angular_error: SupportsFloat | SupportsIndex, max_perp_error: SupportsFloat | SupportsIndex) int

Re-evaluate all observations. Can reactivate observations. Returns number of changed observations.

update_line_observation_activity(self: limap._limap._sfm.StructureObservationManager, max_angular_error: SupportsFloat | SupportsIndex, max_perp_error: SupportsFloat | SupportsIndex) int

Soft filter: mark bad observations as inactive. Returns number of newly inactivated observations.

Filtering, verification and merging

Cleanup applied during and after mapping: dropping structures that lost their support, verifying group associations, and merging duplicated 3D lines.

class limap.sfm.GroupVerificationOptions
__init__(*args, **kwargs)

Overloaded function.

  1. __init__(self: limap._limap._sfm.GroupVerificationOptions) -> None

  2. __init__(self: limap._limap._sfm.GroupVerificationOptions, kwargs: dict) -> None

  3. __init__(self: limap._limap._sfm.GroupVerificationOptions, **kwargs) -> None

mergedict(self: object, kwargs: dict) None
summary(self: limap._limap._sfm.GroupVerificationOptions, write_type: bool = False) str
todict(self: limap._limap._sfm.GroupVerificationOptions, recursive: bool = True) dict
property default_reproj_threshold

3.0)

Type:

Default reprojection threshold in pixels (float, default

property default_vp_threshold

10.0)

Type:

Default VP threshold in degrees (angular error) (float, default

property filter_outliers

True)

Type:

Whether to filter outlier associations (bool, default

property inlier_threshold

-1.0)

Type:

Threshold for inlier determination (-1 = use default) (float, default

property min_inlier_ratio

0.5)

Type:

Minimum inlier ratio to validate (float, default

property min_num_inliers
Type:

Minimum inlier count to validate (int, default

property obs_inlier_ratio

0.8)

Type:

For multi-view

Type:

ratio of observations that must pass (float, default

class limap.sfm.FilterGroupsStats
__init__(*args, **kwargs)

Overloaded function.

  1. __init__(self: limap._limap._sfm.FilterGroupsStats) -> None

  2. __init__(self: limap._limap._sfm.FilterGroupsStats, kwargs: dict) -> None

  3. __init__(self: limap._limap._sfm.FilterGroupsStats, **kwargs) -> None

mergedict(self: object, kwargs: dict) None
summary(self: limap._limap._sfm.FilterGroupsStats, write_type: bool = False) str
todict(self: limap._limap._sfm.FilterGroupsStats, recursive: bool = True) dict
property num_associations_marked
Type:

Number of associations marked inactive (int, default

property num_associations_purged
Type:

Number of inactive associations permanently removed (int, default

property num_groups_failed
Type:

Number of groups that failed verification (int, default

property num_groups_passed
Type:

Number of groups that passed verification (int, default

property num_groups_processed
Type:

Total groups processed (int, default

limap.sfm.filter_group_associations(recon: limap._limap._scene.HolisticReconstruction, options: limap._limap._sfm.GroupVerificationOptions = GroupVerificationOptions(inlier_threshold=-1.0, default_vp_threshold=10.0, default_reproj_threshold=3.0, min_num_inliers=3, min_inlier_ratio=0.5, obs_inlier_ratio=0.8, filter_outliers=True), min_active_for_purge: SupportsInt | SupportsIndex = 10) limap._limap._sfm.FilterGroupsStats

Soft-filter all Group3D associations by error. Marks bad associations inactive, purges for groups with enough active. Never deletes groups. Returns FilterGroupsStats.

limap.sfm.verify_vp_matches(recon: pycolmap._core.Reconstruction, structure_db: limap._limap._scene.StructureDatabase, threshold_degrees: SupportsFloat | SupportsIndex = 10.0) int

Verify all VP matches in the database and update in place. Returns number of removed matches.

limap.sfm.verify_plane_matches(recon: pycolmap._core.Reconstruction, structure_db: limap._limap._scene.StructureDatabase, threshold_degrees: SupportsFloat | SupportsIndex = 30.0) int

Verify all plane matches in the database and update in place. Compares camera-frame normals (from Group2d params) transformed to world frame. Returns number of removed matches.

limap.sfm.delete_supportless_groups(recon: limap._limap._scene.HolisticReconstruction) int

Delete groups with zero active associations or track length < 2. Returns number of groups deleted.

class limap.sfm.LineMergingOptions
__init__(*args, **kwargs)

Overloaded function.

  1. __init__(self: limap._limap._sfm.LineMergingOptions) -> None

  2. __init__(self: limap._limap._sfm.LineMergingOptions, kwargs: dict) -> None

  3. __init__(self: limap._limap._sfm.LineMergingOptions, **kwargs) -> None

check(self: limap._limap._sfm.LineMergingOptions) bool
mergedict(self: object, kwargs: dict) None
summary(self: limap._limap._sfm.LineMergingOptions, write_type: bool = False) str
todict(self: limap._limap._sfm.LineMergingOptions, recursive: bool = True) dict
property enable_remerge

True)

Type:

(bool, default

property filtering2d_th_angular_2d

8.0)

Type:

(float, default

property filtering2d_th_perp_2d

5.0)

Type:

(float, default

property linker2d_options

LineLinker2dOptions(score_th=0.5, th_angle=5.0, th_overlap=0.05, th_smartangle=1.0, th_smartoverlap=0.2, th_perp=2.0, th_innerseg=2.0, use_angle=True, use_overlap=True, use_smartangle=True, use_perp=True, use_innerseg=False))

Type:

(LineLinker2dOptions, default

property linker3d_options

LineLinker3dOptions(score_th=0.5, th_angle=8.0, th_overlap=0.01, th_smartangle=1.0, th_smartoverlap=0.1, th_perp=0.75, th_innerseg=0.75, use_angle=True, use_overlap=True, use_smartangle=True, use_perp=False, use_innerseg=True))

Type:

(LineLinker3dOptions, default

property linker3d_remerge_options

LineLinker3dOptions(score_th=0.5, th_angle=5.0, th_overlap=0.001, th_smartangle=1.0, th_smartoverlap=0.1, th_perp=0.5, th_innerseg=0.5, use_angle=True, use_overlap=True, use_smartangle=True, use_perp=False, use_innerseg=True))

Type:

(LineLinker3dOptions, default

property min_visible_views
Type:

(int, default

property num_outliers_aggregator
Type:

(int, default

property num_threads

-1)

Type:

(int, default

limap.sfm.merge_fitted_lines_3d(recon: limap._limap._scene.HolisticReconstruction, neighbors: collections.abc.Mapping[SupportsInt | SupportsIndex, collections.abc.Sequence[SupportsInt | SupportsIndex]], options: limap._limap._sfm.LineMergingOptions) None

Merge pre-fitted Line3d based on 2D+3D similarity. Modifies recon in-place.