pycolmap


Namepycolmap JSON
Version 3.11.0 PyPI version JSON
download
home_pageNone
SummaryCOLMAP bindings
upload_time2024-11-28 14:27:17
maintainerNone
docs_urlNone
authorNone
requires_python>=3.8
licenseBSD-3-Clause
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Python bindings for COLMAP

PyCOLMAP exposes to Python most capabilities of the
[COLMAP](https://colmap.github.io/) Structure-from-Motion (SfM) and Multi-View
Stereo (MVS) pipeline.

## Installation

Pre-built wheels for Linux, macOS, and Windows can be installed using pip:
```bash
pip install pycolmap
```

The wheels are automatically built and pushed to
[PyPI](https://pypi.org/project/pycolmap/) at each release. They are currently
not built with CUDA support, which requires building from source.

<details>
<summary>[Building PyCOLMAP from source - click to expand]</summary>

1. Install COLMAP from source following [the official guide](https://colmap.github.io/install.html).

3. Build PyCOLMAP:
  - On Linux and macOS:
```bash
cd pycolmap
python -m pip install .
```
  - On Windows, after installing COLMAP [via VCPKG](https://colmap.github.io/install.html#id3), run in powershell:
```powershell
cd pycolmap
python -m pip install . `
    --cmake.define.CMAKE_TOOLCHAIN_FILE="$VCPKG_INSTALLATION_ROOT/scripts/buildsystems/vcpkg.cmake" `
    --cmake.define.VCPKG_TARGET_TRIPLET="x64-windows"
```

</details>

## Reconstruction pipeline

PyCOLMAP provides bindings for multiple steps of the standard reconstruction pipeline:

- extracting and matching SIFT features
- importing an image folder into a COLMAP database
- inferring the camera parameters from the EXIF metadata of an image file
- running two-view geometric verification of matches on a COLMAP database
- triangulating points into an existing COLMAP model
- running incremental reconstruction from a COLMAP database
- dense reconstruction with multi-view stereo

Sparse & Dense reconstruction from a folder of images can be performed with:
```python
output_path: pathlib.Path
image_dir: pathlib.Path

output_path.mkdir()
mvs_path = output_path / "mvs"
database_path = output_path / "database.db"

pycolmap.extract_features(database_path, image_dir)
pycolmap.match_exhaustive(database_path)
maps = pycolmap.incremental_mapping(database_path, image_dir, output_path)
maps[0].write(output_path)
# dense reconstruction
pycolmap.undistort_images(mvs_path, output_path, image_dir)
pycolmap.patch_match_stereo(mvs_path)  # requires compilation with CUDA
pycolmap.stereo_fusion(mvs_path / "dense.ply", mvs_path)
```

PyCOLMAP can leverage the GPU for feature extraction, matching, and multi-view
stereo if COLMAP was compiled with CUDA support. Similarly, PyCOLMAP can run
Delaunay Triangulation if COLMAP was compiled with CGAL support. This requires
to build the package from source and is not available with the PyPI wheels.

All of the above steps are easily configurable with python dicts which are
recursively merged into their respective defaults, for example:
```python
pycolmap.extract_features(database_path, image_dir, sift_options={"max_num_features": 512})
# equivalent to
ops = pycolmap.SiftExtractionOptions()
ops.max_num_features = 512
pycolmap.extract_features(database_path, image_dir, sift_options=ops)
```

To list available options and their default parameters:

```python
help(pycolmap.SiftExtractionOptions)
```

For another example of usage, see [`example.py`](./examples/example.py) or
[`hloc/reconstruction.py`](https://github.com/cvg/Hierarchical-Localization/blob/master/hloc/reconstruction.py).

## Reconstruction object

We can load and manipulate an existing COLMAP 3D reconstruction:

```python
import pycolmap
reconstruction = pycolmap.Reconstruction("path/to/reconstruction/dir")
print(reconstruction.summary())

for image_id, image in reconstruction.images.items():
    print(image_id, image)

for point3D_id, point3D in reconstruction.points3D.items():
    print(point3D_id, point3D)

for camera_id, camera in reconstruction.cameras.items():
    print(camera_id, camera)

reconstruction.write("path/to/reconstruction/dir/")
```

The object API mirrors the COLMAP C++ library. The bindings support many other operations, for example:

- projecting a 3D point into an image with arbitrary camera model:
```python
uv = camera.img_from_cam(image.cam_from_world * point3D.xyz)
```

- aligning two 3D reconstructions by their camera poses:
```python
rec2_from_rec1 = pycolmap.align_reconstructions_via_reprojections(reconstruction1, reconstrution2)
reconstruction1.transform(rec2_from_rec1)
print(rec2_from_rec1.scale, rec2_from_rec1.rotation, rec2_from_rec1.translation)
```

- exporting reconstructions to text, PLY, or other formats:
```python
reconstruction.write_text("path/to/new/reconstruction/dir/")  # text format
reconstruction.export_PLY("rec.ply")  # PLY format
```

## Estimators

We provide robust RANSAC-based estimators for absolute camera pose
(single-camera and multi-camera-rig), essential matrix, fundamental matrix,
homography, and two-view relative pose for calibrated cameras.

All RANSAC and estimation parameters are exposed as objects that behave
similarly as Python dataclasses. The RANSAC options are described in
[`colmap/optim/ransac.h`](https://github.com/colmap/colmap/blob/main/src/colmap/optim/ransac.h#L43-L72)
and their default values are:

```python
ransac_options = pycolmap.RANSACOptions(
    max_error=4.0,  # for example the reprojection error in pixels
    min_inlier_ratio=0.01,
    confidence=0.9999,
    min_num_trials=1000,
    max_num_trials=100000,
)
```

### Absolute pose estimation

For instance, to estimate the absolute pose of a query camera given 2D-3D correspondences:
```python
# Parameters:
# - points2D: Nx2 array; pixel coordinates
# - points3D: Nx3 array; world coordinates
# - camera: pycolmap.Camera
# Optional parameters:
# - estimation_options: dict or pycolmap.AbsolutePoseEstimationOptions
# - refinement_options: dict or pycolmap.AbsolutePoseRefinementOptions
answer = pycolmap.absolute_pose_estimation(points2D, points3D, camera)
# Returns: dictionary of estimation outputs or None if failure
```

2D and 3D points are passed as Numpy arrays or lists. The options are defined in
[`estimators/absolute_pose.cc`](./pycolmap/estimators/absolute_pose.h#L100-L122)
and can be passed as regular (nested) Python dictionaries:

```python
pycolmap.absolute_pose_estimation(
    points2D, points3D, camera,
    estimation_options=dict(ransac=dict(max_error=12.0)),
    refinement_options=dict(refine_focal_length=True),
)
```

### Absolute Pose Refinement

```python
# Parameters:
# - cam_from_world: pycolmap.Rigid3d, initial pose
# - points2D: Nx2 array; pixel coordinates
# - points3D: Nx3 array; world coordinates
# - inlier_mask: array of N bool; inlier_mask[i] is true if correpondence i is an inlier
# - camera: pycolmap.Camera
# Optional parameters:
# - refinement_options: dict or pycolmap.AbsolutePoseRefinementOptions
answer = pycolmap.pose_refinement(cam_from_world, points2D, points3D, inlier_mask, camera)
# Returns: dictionary of refinement outputs or None if failure
```

### Essential matrix estimation

```python
# Parameters:
# - points1: Nx2 array; 2D pixel coordinates in image 1
# - points2: Nx2 array; 2D pixel coordinates in image 2
# - camera1: pycolmap.Camera of image 1
# - camera2: pycolmap.Camera of image 2
# Optional parameters:
# - options: dict or pycolmap.RANSACOptions (default inlier threshold is 4px)
answer = pycolmap.essential_matrix_estimation(points1, points2, camera1, camera2)
# Returns: dictionary of estimation outputs or None if failure
```

### Fundamental matrix estimation

```python
answer = pycolmap.fundamental_matrix_estimation(
    points1,
    points2,
    [options],       # optional dict or pycolmap.RANSACOptions
)
```

### Homography estimation

```python
answer = pycolmap.homography_matrix_estimation(
    points1,
    points2,
    [options],       # optional dict or pycolmap.RANSACOptions
)
```

### Two-view geometry estimation

COLMAP can also estimate a relative pose between two calibrated cameras by
estimating both E and H and accounting for the degeneracies of each model.

```python
# Parameters:
# - camera1: pycolmap.Camera of image 1
# - points1: Nx2 array; 2D pixel coordinates in image 1
# - camera2: pycolmap.Camera of image 2
# - points2: Nx2 array; 2D pixel coordinates in image 2
# Optional parameters:
# - matches: Nx2 integer array; correspondences across images
# - options: dict or pycolmap.TwoViewGeometryOptions
answer = pycolmap.estimate_calibrated_two_view_geometry(camera1, points1, camera2, points2)
# Returns: pycolmap.TwoViewGeometry
```

The `TwoViewGeometryOptions` control how each model is selected. The output
structure contains the geometric model, inlier matches, the relative pose (if
`options.compute_relative_pose=True`), and the type of camera configuration,
which is an instance of the enum `pycolmap.TwoViewGeometryConfiguration`.

### Camera argument

Some estimators expect a COLMAP camera object, which can be created as follows:

```python
camera = pycolmap.Camera(
    model=camera_model_name_or_id,
    width=width,
    height=height,
    params=params,
)
```

The different camera models and their extra parameters are defined in
[`colmap/src/colmap/sensor/models.h`](https://github.com/colmap/colmap/blob/main/src/colmap/sensor/models.h).
For example for a pinhole camera:

```python
camera = pycolmap.Camera(
    model='SIMPLE_PINHOLE',
    width=width,
    height=height,
    params=[focal_length, cx, cy],
)
```

Alternatively, we can also pass a camera dictionary:

```python
camera_dict = {
    'model': COLMAP_CAMERA_MODEL_NAME_OR_ID,
    'width': IMAGE_WIDTH,
    'height': IMAGE_HEIGHT,
    'params': EXTRA_CAMERA_PARAMETERS_LIST
}
```


## SIFT feature extraction

```python
import numpy as np
import pycolmap
from PIL import Image, ImageOps

# Input should be grayscale image with range [0, 1].
img = Image.open('image.jpg').convert('RGB')
img = ImageOps.grayscale(img)
img = np.array(img).astype(np.float) / 255.

# Optional parameters:
# - options: dict or pycolmap.SiftExtractionOptions
# - device: default pycolmap.Device.auto uses the GPU if available
sift = pycolmap.Sift()

# Parameters:
# - image: HxW float array
keypoints, descriptors = sift.extract(img)
# Returns:
# - keypoints: Nx4 array; format: x (j), y (i), scale, orientation
# - descriptors: Nx128 array; L2-normalized descriptors
```

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "pycolmap",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": null,
    "author": null,
    "author_email": "=?utf-8?q?Johannes_Sch=C3=B6nberger?= <jsch@demuc.de>, Mihai Dusmanu <mihai.dusmanu@gmail.com>, Paul-Edouard Sarlin <psarlin@ethz.ch>, Shaohui Liu <b1ueber2y@gmail.com>, Philipp Lindenberger <plindenbe@ethz.ch>",
    "download_url": null,
    "platform": null,
    "description": "# Python bindings for COLMAP\n\nPyCOLMAP exposes to Python most capabilities of the\n[COLMAP](https://colmap.github.io/) Structure-from-Motion (SfM) and Multi-View\nStereo (MVS) pipeline.\n\n## Installation\n\nPre-built wheels for Linux, macOS, and Windows can be installed using pip:\n```bash\npip install pycolmap\n```\n\nThe wheels are automatically built and pushed to\n[PyPI](https://pypi.org/project/pycolmap/) at each release. They are currently\nnot built with CUDA support, which requires building from source.\n\n<details>\n<summary>[Building PyCOLMAP from source - click to expand]</summary>\n\n1. Install COLMAP from source following [the official guide](https://colmap.github.io/install.html).\n\n3. Build PyCOLMAP:\n  - On Linux and macOS:\n```bash\ncd pycolmap\npython -m pip install .\n```\n  - On Windows, after installing COLMAP [via VCPKG](https://colmap.github.io/install.html#id3), run in powershell:\n```powershell\ncd pycolmap\npython -m pip install . `\n    --cmake.define.CMAKE_TOOLCHAIN_FILE=\"$VCPKG_INSTALLATION_ROOT/scripts/buildsystems/vcpkg.cmake\" `\n    --cmake.define.VCPKG_TARGET_TRIPLET=\"x64-windows\"\n```\n\n</details>\n\n## Reconstruction pipeline\n\nPyCOLMAP provides bindings for multiple steps of the standard reconstruction pipeline:\n\n- extracting and matching SIFT features\n- importing an image folder into a COLMAP database\n- inferring the camera parameters from the EXIF metadata of an image file\n- running two-view geometric verification of matches on a COLMAP database\n- triangulating points into an existing COLMAP model\n- running incremental reconstruction from a COLMAP database\n- dense reconstruction with multi-view stereo\n\nSparse & Dense reconstruction from a folder of images can be performed with:\n```python\noutput_path: pathlib.Path\nimage_dir: pathlib.Path\n\noutput_path.mkdir()\nmvs_path = output_path / \"mvs\"\ndatabase_path = output_path / \"database.db\"\n\npycolmap.extract_features(database_path, image_dir)\npycolmap.match_exhaustive(database_path)\nmaps = pycolmap.incremental_mapping(database_path, image_dir, output_path)\nmaps[0].write(output_path)\n# dense reconstruction\npycolmap.undistort_images(mvs_path, output_path, image_dir)\npycolmap.patch_match_stereo(mvs_path)  # requires compilation with CUDA\npycolmap.stereo_fusion(mvs_path / \"dense.ply\", mvs_path)\n```\n\nPyCOLMAP can leverage the GPU for feature extraction, matching, and multi-view\nstereo if COLMAP was compiled with CUDA support. Similarly, PyCOLMAP can run\nDelaunay Triangulation if COLMAP was compiled with CGAL support. This requires\nto build the package from source and is not available with the PyPI wheels.\n\nAll of the above steps are easily configurable with python dicts which are\nrecursively merged into their respective defaults, for example:\n```python\npycolmap.extract_features(database_path, image_dir, sift_options={\"max_num_features\": 512})\n# equivalent to\nops = pycolmap.SiftExtractionOptions()\nops.max_num_features = 512\npycolmap.extract_features(database_path, image_dir, sift_options=ops)\n```\n\nTo list available options and their default parameters:\n\n```python\nhelp(pycolmap.SiftExtractionOptions)\n```\n\nFor another example of usage, see [`example.py`](./examples/example.py) or\n[`hloc/reconstruction.py`](https://github.com/cvg/Hierarchical-Localization/blob/master/hloc/reconstruction.py).\n\n## Reconstruction object\n\nWe can load and manipulate an existing COLMAP 3D reconstruction:\n\n```python\nimport pycolmap\nreconstruction = pycolmap.Reconstruction(\"path/to/reconstruction/dir\")\nprint(reconstruction.summary())\n\nfor image_id, image in reconstruction.images.items():\n    print(image_id, image)\n\nfor point3D_id, point3D in reconstruction.points3D.items():\n    print(point3D_id, point3D)\n\nfor camera_id, camera in reconstruction.cameras.items():\n    print(camera_id, camera)\n\nreconstruction.write(\"path/to/reconstruction/dir/\")\n```\n\nThe object API mirrors the COLMAP C++ library. The bindings support many other operations, for example:\n\n- projecting a 3D point into an image with arbitrary camera model:\n```python\nuv = camera.img_from_cam(image.cam_from_world * point3D.xyz)\n```\n\n- aligning two 3D reconstructions by their camera poses:\n```python\nrec2_from_rec1 = pycolmap.align_reconstructions_via_reprojections(reconstruction1, reconstrution2)\nreconstruction1.transform(rec2_from_rec1)\nprint(rec2_from_rec1.scale, rec2_from_rec1.rotation, rec2_from_rec1.translation)\n```\n\n- exporting reconstructions to text, PLY, or other formats:\n```python\nreconstruction.write_text(\"path/to/new/reconstruction/dir/\")  # text format\nreconstruction.export_PLY(\"rec.ply\")  # PLY format\n```\n\n## Estimators\n\nWe provide robust RANSAC-based estimators for absolute camera pose\n(single-camera and multi-camera-rig), essential matrix, fundamental matrix,\nhomography, and two-view relative pose for calibrated cameras.\n\nAll RANSAC and estimation parameters are exposed as objects that behave\nsimilarly as Python dataclasses. The RANSAC options are described in\n[`colmap/optim/ransac.h`](https://github.com/colmap/colmap/blob/main/src/colmap/optim/ransac.h#L43-L72)\nand their default values are:\n\n```python\nransac_options = pycolmap.RANSACOptions(\n    max_error=4.0,  # for example the reprojection error in pixels\n    min_inlier_ratio=0.01,\n    confidence=0.9999,\n    min_num_trials=1000,\n    max_num_trials=100000,\n)\n```\n\n### Absolute pose estimation\n\nFor instance, to estimate the absolute pose of a query camera given 2D-3D correspondences:\n```python\n# Parameters:\n# - points2D: Nx2 array; pixel coordinates\n# - points3D: Nx3 array; world coordinates\n# - camera: pycolmap.Camera\n# Optional parameters:\n# - estimation_options: dict or pycolmap.AbsolutePoseEstimationOptions\n# - refinement_options: dict or pycolmap.AbsolutePoseRefinementOptions\nanswer = pycolmap.absolute_pose_estimation(points2D, points3D, camera)\n# Returns: dictionary of estimation outputs or None if failure\n```\n\n2D and 3D points are passed as Numpy arrays or lists. The options are defined in\n[`estimators/absolute_pose.cc`](./pycolmap/estimators/absolute_pose.h#L100-L122)\nand can be passed as regular (nested) Python dictionaries:\n\n```python\npycolmap.absolute_pose_estimation(\n    points2D, points3D, camera,\n    estimation_options=dict(ransac=dict(max_error=12.0)),\n    refinement_options=dict(refine_focal_length=True),\n)\n```\n\n### Absolute Pose Refinement\n\n```python\n# Parameters:\n# - cam_from_world: pycolmap.Rigid3d, initial pose\n# - points2D: Nx2 array; pixel coordinates\n# - points3D: Nx3 array; world coordinates\n# - inlier_mask: array of N bool; inlier_mask[i] is true if correpondence i is an inlier\n# - camera: pycolmap.Camera\n# Optional parameters:\n# - refinement_options: dict or pycolmap.AbsolutePoseRefinementOptions\nanswer = pycolmap.pose_refinement(cam_from_world, points2D, points3D, inlier_mask, camera)\n# Returns: dictionary of refinement outputs or None if failure\n```\n\n### Essential matrix estimation\n\n```python\n# Parameters:\n# - points1: Nx2 array; 2D pixel coordinates in image 1\n# - points2: Nx2 array; 2D pixel coordinates in image 2\n# - camera1: pycolmap.Camera of image 1\n# - camera2: pycolmap.Camera of image 2\n# Optional parameters:\n# - options: dict or pycolmap.RANSACOptions (default inlier threshold is 4px)\nanswer = pycolmap.essential_matrix_estimation(points1, points2, camera1, camera2)\n# Returns: dictionary of estimation outputs or None if failure\n```\n\n### Fundamental matrix estimation\n\n```python\nanswer = pycolmap.fundamental_matrix_estimation(\n    points1,\n    points2,\n    [options],       # optional dict or pycolmap.RANSACOptions\n)\n```\n\n### Homography estimation\n\n```python\nanswer = pycolmap.homography_matrix_estimation(\n    points1,\n    points2,\n    [options],       # optional dict or pycolmap.RANSACOptions\n)\n```\n\n### Two-view geometry estimation\n\nCOLMAP can also estimate a relative pose between two calibrated cameras by\nestimating both E and H and accounting for the degeneracies of each model.\n\n```python\n# Parameters:\n# - camera1: pycolmap.Camera of image 1\n# - points1: Nx2 array; 2D pixel coordinates in image 1\n# - camera2: pycolmap.Camera of image 2\n# - points2: Nx2 array; 2D pixel coordinates in image 2\n# Optional parameters:\n# - matches: Nx2 integer array; correspondences across images\n# - options: dict or pycolmap.TwoViewGeometryOptions\nanswer = pycolmap.estimate_calibrated_two_view_geometry(camera1, points1, camera2, points2)\n# Returns: pycolmap.TwoViewGeometry\n```\n\nThe `TwoViewGeometryOptions` control how each model is selected. The output\nstructure contains the geometric model, inlier matches, the relative pose (if\n`options.compute_relative_pose=True`), and the type of camera configuration,\nwhich is an instance of the enum `pycolmap.TwoViewGeometryConfiguration`.\n\n### Camera argument\n\nSome estimators expect a COLMAP camera object, which can be created as follows:\n\n```python\ncamera = pycolmap.Camera(\n    model=camera_model_name_or_id,\n    width=width,\n    height=height,\n    params=params,\n)\n```\n\nThe different camera models and their extra parameters are defined in\n[`colmap/src/colmap/sensor/models.h`](https://github.com/colmap/colmap/blob/main/src/colmap/sensor/models.h).\nFor example for a pinhole camera:\n\n```python\ncamera = pycolmap.Camera(\n    model='SIMPLE_PINHOLE',\n    width=width,\n    height=height,\n    params=[focal_length, cx, cy],\n)\n```\n\nAlternatively, we can also pass a camera dictionary:\n\n```python\ncamera_dict = {\n    'model': COLMAP_CAMERA_MODEL_NAME_OR_ID,\n    'width': IMAGE_WIDTH,\n    'height': IMAGE_HEIGHT,\n    'params': EXTRA_CAMERA_PARAMETERS_LIST\n}\n```\n\n\n## SIFT feature extraction\n\n```python\nimport numpy as np\nimport pycolmap\nfrom PIL import Image, ImageOps\n\n# Input should be grayscale image with range [0, 1].\nimg = Image.open('image.jpg').convert('RGB')\nimg = ImageOps.grayscale(img)\nimg = np.array(img).astype(np.float) / 255.\n\n# Optional parameters:\n# - options: dict or pycolmap.SiftExtractionOptions\n# - device: default pycolmap.Device.auto uses the GPU if available\nsift = pycolmap.Sift()\n\n# Parameters:\n# - image: HxW float array\nkeypoints, descriptors = sift.extract(img)\n# Returns:\n# - keypoints: Nx4 array; format: x (j), y (i), scale, orientation\n# - descriptors: Nx128 array; L2-normalized descriptors\n```\n",
    "bugtrack_url": null,
    "license": "BSD-3-Clause",
    "summary": "COLMAP bindings",
    "version": "3.11.0",
    "project_urls": {
        "Repository": "https://github.com/colmap/colmap"
    },
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "0066f140ff014e476618ba8dc608faf2badb03a0456afd12a932ad20ffe80aa8",
                "md5": "f6cef929ecfa7cf1a95deb74b52a76dc",
                "sha256": "53f745a319c69f223a0ac37f088ff0c9c14c879426aeae38032c989d2ffb46fd"
            },
            "downloads": -1,
            "filename": "pycolmap-3.11.0-cp310-cp310-macosx_10_15_x86_64.whl",
            "has_sig": false,
            "md5_digest": "f6cef929ecfa7cf1a95deb74b52a76dc",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 9576622,
            "upload_time": "2024-11-28T14:27:17",
            "upload_time_iso_8601": "2024-11-28T14:27:17.312955Z",
            "url": "https://files.pythonhosted.org/packages/00/66/f140ff014e476618ba8dc608faf2badb03a0456afd12a932ad20ffe80aa8/pycolmap-3.11.0-cp310-cp310-macosx_10_15_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "93c7f2f92e8624c051d7b894ee0ad156fa2419abbdadc1f6c5e62493fff6dc8a",
                "md5": "26a3dcb970e87c7323e90aa2fb8e4079",
                "sha256": "d92bf83dc39bda2b46c0110ed3d49ef06d25691d35fd31525378866e1aef247f"
            },
            "downloads": -1,
            "filename": "pycolmap-3.11.0-cp310-cp310-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "26a3dcb970e87c7323e90aa2fb8e4079",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 8387505,
            "upload_time": "2024-11-28T14:27:20",
            "upload_time_iso_8601": "2024-11-28T14:27:20.063362Z",
            "url": "https://files.pythonhosted.org/packages/93/c7/f2f92e8624c051d7b894ee0ad156fa2419abbdadc1f6c5e62493fff6dc8a/pycolmap-3.11.0-cp310-cp310-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "cddb535e28351733cd89fddcb3139ab1506764072d31de90d8d86c44256d8ea6",
                "md5": "fee58b292dea7c13d1dd2e2a8507ddc4",
                "sha256": "0558e1232ea890306c2db5c9e247dd2aa5be6a99df9b434446ccff7fa8de9f2d"
            },
            "downloads": -1,
            "filename": "pycolmap-3.11.0-cp310-cp310-manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "fee58b292dea7c13d1dd2e2a8507ddc4",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 12410721,
            "upload_time": "2024-11-28T14:27:22",
            "upload_time_iso_8601": "2024-11-28T14:27:22.307805Z",
            "url": "https://files.pythonhosted.org/packages/cd/db/535e28351733cd89fddcb3139ab1506764072d31de90d8d86c44256d8ea6/pycolmap-3.11.0-cp310-cp310-manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "7997124a17b0422c6cbb1125c0a1007ee43651e6d17fb83f6e3d532df4486af3",
                "md5": "38cbef61df205c63d962e616af26688f",
                "sha256": "4ae5cbd1efde6842f0969a03461cfa87e11f95a5bea33586b167b5d55315e9db"
            },
            "downloads": -1,
            "filename": "pycolmap-3.11.0-cp310-cp310-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "38cbef61df205c63d962e616af26688f",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": ">=3.8",
            "size": 13729853,
            "upload_time": "2024-11-28T14:27:24",
            "upload_time_iso_8601": "2024-11-28T14:27:24.378350Z",
            "url": "https://files.pythonhosted.org/packages/79/97/124a17b0422c6cbb1125c0a1007ee43651e6d17fb83f6e3d532df4486af3/pycolmap-3.11.0-cp310-cp310-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "5c91d4e6f7512c0f4e4a6c69a7385b99d376787232216fd5f0af92c5103399eb",
                "md5": "1704127271e5aef6a3eb4cd0f93f5be1",
                "sha256": "a24a602212b4f33e1d6d56574acda8840d7ab720ff11af251ca564ea911b828c"
            },
            "downloads": -1,
            "filename": "pycolmap-3.11.0-cp311-cp311-macosx_10_15_x86_64.whl",
            "has_sig": false,
            "md5_digest": "1704127271e5aef6a3eb4cd0f93f5be1",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 9577231,
            "upload_time": "2024-11-28T14:27:27",
            "upload_time_iso_8601": "2024-11-28T14:27:27.338056Z",
            "url": "https://files.pythonhosted.org/packages/5c/91/d4e6f7512c0f4e4a6c69a7385b99d376787232216fd5f0af92c5103399eb/pycolmap-3.11.0-cp311-cp311-macosx_10_15_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "a21adb98200da1e8b16163143a9db7522b153500dfaf7f856cdab78ed0746577",
                "md5": "6c76cbe283461b9488a0e6c3dadcc618",
                "sha256": "ab981397c46f4ce4c6804080ad8fe17f923b42c32eda7c3801753cf4c4e062d4"
            },
            "downloads": -1,
            "filename": "pycolmap-3.11.0-cp311-cp311-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "6c76cbe283461b9488a0e6c3dadcc618",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 8387628,
            "upload_time": "2024-11-28T14:27:29",
            "upload_time_iso_8601": "2024-11-28T14:27:29.279084Z",
            "url": "https://files.pythonhosted.org/packages/a2/1a/db98200da1e8b16163143a9db7522b153500dfaf7f856cdab78ed0746577/pycolmap-3.11.0-cp311-cp311-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "5068ca33481510c86b9d2a74a7af6cf78aaa994b5621452ed19784d7f4d3e4d3",
                "md5": "80a68849198a6d97bafd119359d32356",
                "sha256": "23481b602860f6c839e13338ab93530b5f408ac702a939e4d26654c0ff7f3b43"
            },
            "downloads": -1,
            "filename": "pycolmap-3.11.0-cp311-cp311-manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "80a68849198a6d97bafd119359d32356",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 12409621,
            "upload_time": "2024-11-28T14:27:31",
            "upload_time_iso_8601": "2024-11-28T14:27:31.510926Z",
            "url": "https://files.pythonhosted.org/packages/50/68/ca33481510c86b9d2a74a7af6cf78aaa994b5621452ed19784d7f4d3e4d3/pycolmap-3.11.0-cp311-cp311-manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "44c0e63d0e32734f7aa3cf0c8e1650486029dfcfd334fd97c17aabaa3d78dafe",
                "md5": "05e9a389467524e85f82d8923f2ffb84",
                "sha256": "93c27481dd34d0b99bdb7388245caa3e667fb316b69a784a762180a67258311b"
            },
            "downloads": -1,
            "filename": "pycolmap-3.11.0-cp311-cp311-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "05e9a389467524e85f82d8923f2ffb84",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": ">=3.8",
            "size": 13734145,
            "upload_time": "2024-11-28T14:27:34",
            "upload_time_iso_8601": "2024-11-28T14:27:34.227019Z",
            "url": "https://files.pythonhosted.org/packages/44/c0/e63d0e32734f7aa3cf0c8e1650486029dfcfd334fd97c17aabaa3d78dafe/pycolmap-3.11.0-cp311-cp311-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "1cdf3ea1349e6bed534e1223602e0cb0d943cf1a96a392ab47b9d1e325b168ed",
                "md5": "e8e7c059f5a98576a69c97a65d18f42c",
                "sha256": "c634ce3acdecf9f90b95297faf577dd1d083a741fb9850102921f27bec8421c7"
            },
            "downloads": -1,
            "filename": "pycolmap-3.11.0-cp312-cp312-macosx_10_15_x86_64.whl",
            "has_sig": false,
            "md5_digest": "e8e7c059f5a98576a69c97a65d18f42c",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 9623954,
            "upload_time": "2024-11-28T14:27:37",
            "upload_time_iso_8601": "2024-11-28T14:27:37.875490Z",
            "url": "https://files.pythonhosted.org/packages/1c/df/3ea1349e6bed534e1223602e0cb0d943cf1a96a392ab47b9d1e325b168ed/pycolmap-3.11.0-cp312-cp312-macosx_10_15_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "97a53905bd3410f161bf3b635d1ad618f8eb7ed39b911d60a047e339963ee814",
                "md5": "d5dcd8122399cbfe55b3f33842911c62",
                "sha256": "6ef170c1aad2fe5cb4ee4ffda7e668095bcdd3f6f900129d87dd5018bfb8e4a2"
            },
            "downloads": -1,
            "filename": "pycolmap-3.11.0-cp312-cp312-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "d5dcd8122399cbfe55b3f33842911c62",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 8412700,
            "upload_time": "2024-11-28T14:27:40",
            "upload_time_iso_8601": "2024-11-28T14:27:40.049868Z",
            "url": "https://files.pythonhosted.org/packages/97/a5/3905bd3410f161bf3b635d1ad618f8eb7ed39b911d60a047e339963ee814/pycolmap-3.11.0-cp312-cp312-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "3a0ff0c2d507529e7984568ea2b16e51e160080930affe932d9667e268b74681",
                "md5": "90fc87656129ca0d3e7842aa356f5acc",
                "sha256": "94dfc0724d0fbf4603a4f9e594e9f3d0dc51bb170dac0db631e9639149080099"
            },
            "downloads": -1,
            "filename": "pycolmap-3.11.0-cp312-cp312-manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "90fc87656129ca0d3e7842aa356f5acc",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 12413369,
            "upload_time": "2024-11-28T14:27:42",
            "upload_time_iso_8601": "2024-11-28T14:27:42.830082Z",
            "url": "https://files.pythonhosted.org/packages/3a/0f/f0c2d507529e7984568ea2b16e51e160080930affe932d9667e268b74681/pycolmap-3.11.0-cp312-cp312-manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "eef036dab25fab3f1b04afd0ebfdb3c12c6341196e136231b76f51eb071c2b64",
                "md5": "e9e369e35ca375034dbe4392710c0045",
                "sha256": "7182dd12dfaf4e5edaf5eef6533179ef2a07f3b23ebb9018008c6fbd85344c71"
            },
            "downloads": -1,
            "filename": "pycolmap-3.11.0-cp312-cp312-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "e9e369e35ca375034dbe4392710c0045",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": ">=3.8",
            "size": 13746548,
            "upload_time": "2024-11-28T14:27:45",
            "upload_time_iso_8601": "2024-11-28T14:27:45.382627Z",
            "url": "https://files.pythonhosted.org/packages/ee/f0/36dab25fab3f1b04afd0ebfdb3c12c6341196e136231b76f51eb071c2b64/pycolmap-3.11.0-cp312-cp312-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "7ba644e7ccd6ae4ab7002329b9cc73a02834c53f980ea32487de0f98304107bd",
                "md5": "52bbac503d170d30fef484e8aa7ecb3e",
                "sha256": "b700c196464ccedbe0d55d2980b8a3446eab92427536f1437a533849e603da1e"
            },
            "downloads": -1,
            "filename": "pycolmap-3.11.0-cp38-cp38-macosx_10_15_x86_64.whl",
            "has_sig": false,
            "md5_digest": "52bbac503d170d30fef484e8aa7ecb3e",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 9576391,
            "upload_time": "2024-11-28T14:27:47",
            "upload_time_iso_8601": "2024-11-28T14:27:47.467529Z",
            "url": "https://files.pythonhosted.org/packages/7b/a6/44e7ccd6ae4ab7002329b9cc73a02834c53f980ea32487de0f98304107bd/pycolmap-3.11.0-cp38-cp38-macosx_10_15_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "584c5544dc579316ebc2f7bb6d074bb13e7938eebd6c779fd926d357e7e15545",
                "md5": "4df675aef6e322846af40e01e1998fb3",
                "sha256": "a956edd4f2db8443274daee3e38f80f32868cecf499f5a1ffde0bf22583c0758"
            },
            "downloads": -1,
            "filename": "pycolmap-3.11.0-cp38-cp38-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "4df675aef6e322846af40e01e1998fb3",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 8387357,
            "upload_time": "2024-11-28T14:27:50",
            "upload_time_iso_8601": "2024-11-28T14:27:50.281697Z",
            "url": "https://files.pythonhosted.org/packages/58/4c/5544dc579316ebc2f7bb6d074bb13e7938eebd6c779fd926d357e7e15545/pycolmap-3.11.0-cp38-cp38-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "f8b2574cbd010d88883cb1f1adaee4195b1110e7f9c8cd92445bfb86dbcac1bc",
                "md5": "7ac4bfe1a143db0a2aa4158087b0266f",
                "sha256": "8e88417dc2aa4f44a9e8953cb4bab3df71d0f4b292e04c18921942cfa462f292"
            },
            "downloads": -1,
            "filename": "pycolmap-3.11.0-cp38-cp38-manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "7ac4bfe1a143db0a2aa4158087b0266f",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 12408555,
            "upload_time": "2024-11-28T14:27:52",
            "upload_time_iso_8601": "2024-11-28T14:27:52.662145Z",
            "url": "https://files.pythonhosted.org/packages/f8/b2/574cbd010d88883cb1f1adaee4195b1110e7f9c8cd92445bfb86dbcac1bc/pycolmap-3.11.0-cp38-cp38-manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "1a391319a4c1417ef9f67064d427896c73af822e1a7baec7869550634e31045d",
                "md5": "2a36ddff54645e3e05768304ec9a406a",
                "sha256": "59875bb2294814d50b461ab3faaeb79b80d5a5a90703e7712adc098387668707"
            },
            "downloads": -1,
            "filename": "pycolmap-3.11.0-cp38-cp38-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "2a36ddff54645e3e05768304ec9a406a",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": ">=3.8",
            "size": 13736895,
            "upload_time": "2024-11-28T14:27:54",
            "upload_time_iso_8601": "2024-11-28T14:27:54.675221Z",
            "url": "https://files.pythonhosted.org/packages/1a/39/1319a4c1417ef9f67064d427896c73af822e1a7baec7869550634e31045d/pycolmap-3.11.0-cp38-cp38-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "1e55382df1450426deadabaa3a7ee9cb5eb21fc95464da94d00f6ed6c7139b38",
                "md5": "cedab1f118b17496fac20f70a3e560c3",
                "sha256": "dbf6e944e3c2635955cad5136d750def68b2db15f7040808959960d8e3548a42"
            },
            "downloads": -1,
            "filename": "pycolmap-3.11.0-cp39-cp39-macosx_10_15_x86_64.whl",
            "has_sig": false,
            "md5_digest": "cedab1f118b17496fac20f70a3e560c3",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 9576606,
            "upload_time": "2024-11-28T14:27:57",
            "upload_time_iso_8601": "2024-11-28T14:27:57.606563Z",
            "url": "https://files.pythonhosted.org/packages/1e/55/382df1450426deadabaa3a7ee9cb5eb21fc95464da94d00f6ed6c7139b38/pycolmap-3.11.0-cp39-cp39-macosx_10_15_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "496982e2f9873ca223f80d685426461bb06327d0d258d379c9bf5613a6aaf8d8",
                "md5": "7ea9e3e0161427576e5b5d297974cc1b",
                "sha256": "b133a540c7089f9291e031f4253306a8e2f872a47ca402e097f2a104538db100"
            },
            "downloads": -1,
            "filename": "pycolmap-3.11.0-cp39-cp39-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "7ea9e3e0161427576e5b5d297974cc1b",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 8387441,
            "upload_time": "2024-11-28T14:27:59",
            "upload_time_iso_8601": "2024-11-28T14:27:59.569865Z",
            "url": "https://files.pythonhosted.org/packages/49/69/82e2f9873ca223f80d685426461bb06327d0d258d379c9bf5613a6aaf8d8/pycolmap-3.11.0-cp39-cp39-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "952203bfa0dcf398397cb9b5e6d7935cfb306441262ec4c691f6f8a9abd5014b",
                "md5": "86fa2445511295448888f9d3e5be2323",
                "sha256": "a7f99b0294934b83310d53eaf27baede76dcda3459d1e267fc25ebe45a7e7314"
            },
            "downloads": -1,
            "filename": "pycolmap-3.11.0-cp39-cp39-manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "86fa2445511295448888f9d3e5be2323",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 12398573,
            "upload_time": "2024-11-28T14:28:01",
            "upload_time_iso_8601": "2024-11-28T14:28:01.170664Z",
            "url": "https://files.pythonhosted.org/packages/95/22/03bfa0dcf398397cb9b5e6d7935cfb306441262ec4c691f6f8a9abd5014b/pycolmap-3.11.0-cp39-cp39-manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "63e46dbe129e4ab8f68643aadd84614be359dc1e54c09a9116e54786d16a0b06",
                "md5": "e1666023c6fc4c16f3860d1bf96b3065",
                "sha256": "6d58cec33532064548bf267c3db751a5620a3aa37a5d19d525827da293f6fc8e"
            },
            "downloads": -1,
            "filename": "pycolmap-3.11.0-cp39-cp39-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "e1666023c6fc4c16f3860d1bf96b3065",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": ">=3.8",
            "size": 13857119,
            "upload_time": "2024-11-28T14:28:03",
            "upload_time_iso_8601": "2024-11-28T14:28:03.498840Z",
            "url": "https://files.pythonhosted.org/packages/63/e4/6dbe129e4ab8f68643aadd84614be359dc1e54c09a9116e54786d16a0b06/pycolmap-3.11.0-cp39-cp39-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-11-28 14:27:17",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "colmap",
    "github_project": "colmap",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "pycolmap"
}
        
Elapsed time: 0.51141s