{"id":33328262,"url":"https://github.com/ezwelty/glimpse","last_synced_at":"2026-03-06T14:32:26.238Z","repository":{"id":54666509,"uuid":"97528519","full_name":"ezwelty/glimpse","owner":"ezwelty","description":"glimpse: Glacier Image Particle Sequencer","archived":false,"fork":false,"pushed_at":"2025-11-20T12:25:43.000Z","size":1520,"stargazers_count":13,"open_issues_count":17,"forks_count":1,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-11-20T14:33:27.545Z","etag":null,"topics":["camera-calibration","computer-vision","glaciology","particle-filter","photogrammetry","time-lapse-imaging"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ezwelty.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2017-07-17T22:40:13.000Z","updated_at":"2025-11-20T12:22:42.000Z","dependencies_parsed_at":"2024-05-06T17:53:45.452Z","dependency_job_id":null,"html_url":"https://github.com/ezwelty/glimpse","commit_stats":{"total_commits":693,"total_committers":2,"mean_commits":346.5,"dds":"0.023088023088023046","last_synced_commit":"7112a763403e0e8ef9f85d88cc15bb91203d207d"},"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/ezwelty/glimpse","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ezwelty%2Fglimpse","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ezwelty%2Fglimpse/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ezwelty%2Fglimpse/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ezwelty%2Fglimpse/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ezwelty","download_url":"https://codeload.github.com/ezwelty/glimpse/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ezwelty%2Fglimpse/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30180672,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-06T12:39:21.703Z","status":"ssl_error","status_checked_at":"2026-03-06T12:36:09.819Z","response_time":250,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["camera-calibration","computer-vision","glaciology","particle-filter","photogrammetry","time-lapse-imaging"],"created_at":"2025-11-20T14:04:22.804Z","updated_at":"2026-03-06T14:32:26.204Z","avatar_url":"https://github.com/ezwelty.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"`glimpse` Glacier Image Particle Sequencer\n==========================================\n\n[![tests](https://github.com/ezwelty/glimpse/workflows/tests/badge.svg)](https://github.com/ezwelty/glimpse/actions?workflow=tests)\n[![coverage](https://codecov.io/gh/ezwelty/glimpse/branch/main/graph/badge.svg)](https://codecov.io/gh/ezwelty/glimpse)\n[![code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black)\n\n`glimpse` is a Python package built for quickly and precisely analyzing time-lapse photographs of glaciers.\nSome useful things one can do with `glimpse`:\n\n#### Camera calibration\n\n  - `glimpse.Camera`: Model a distorted camera and perform incoming and outgoing ray projections, accounting for earth curvature and atmospheric refraction.\n  - `glimpse.convert`: Convert between MATLAB, OpenCV, Agisoft PhotoScan, PhotoModeler, and glimpse camera formats, accounting for uncertainties in camera parameters.\n  - `glimpse.optimize`: Perform single and multi-camera calibrations (controlling which parameters are fixed, varied, or synched across multiple cameras) using points and lines in image and world coordinates.\n  - `glimpse.svg`: Load manual vector image annotations as inputs for camera calibration.\n  - `glimpse.Raster.horizon()`: Compute the visible horizon from a position as input for camera calibration.\n  - `glimpse.Camera.project_dem()`: Generate photorealistic synthetic images (and depth maps) from a camera model, gridded elevations, and optional orthophoto for automated control point collection and camera model validation.\n  - `glimpse.optimize.KeypointMatcher`: Stabilize photographic sequences of arbitrary length using automatic image matching and globally optimal orientation estimates.\n\n#### Velocity tracking\n\n  - `glimpse.Tracker`: Compute the velocity (and corresponding uncertainty) of points visible in photographs taken from one or more positions.\n  - `glimpse.Raster.viewshed()`: Compute the viewshed of a position, for tracking point selection.\n\n### References\n\nThe methods implemented in this software are described in great detail across two PhD dissertations.\n\n- Douglas Brinkerhoff (2017): *[Bayesian methods in glaciology](http://hdl.handle.net/11122/8113)*, chapter 4. Uses particle filtering to extract velocities from one year of oblique time-lapse images of Columbia Glacier, Alaska.\n\n- Ethan Welty (2018): *[High-precision photogrammetry for glaciology](https://doi.org/10.13140/RG.2.2.20751.64164)*. Calibrates and stabilizes time-lapse cameras using landscape cues, extends the particle filter from 2-d to 3-d (to account for uncertain surface elevations), and uses the methods on thirteen years of oblique time-lapse images of Columbia Glacier, Alaska.\n\n# Installation\n\n`glimpse` has not yet been released for distribution, but can still be installed with [`pip`](https://pip.pypa.io/en/stable/installing) from the source code on GitHub:\n\n```bash\npip install git+https://github.com/ezwelty/glimpse\n```\n\nThe installation requires [`gdal`](https://gdal.org/download.html#binaries) to be present. The simplest way of achieving this is to install `gdal` into a [`conda`](https://docs.conda.io/projects/conda/en/latest/user-guide/install) environment:\n\n```bash\nconda create -n glimpse -c conda-forge python=3.8 gdal=3.2.0\nconda activate glimpse\npip install git+https://github.com/ezwelty/glimpse\n```\n\n# Contribute\n\nThank you for considering contributing to `glimpse`!\n\nWhat follows is intended to make contribution more accessible by codifying conventions.\nDon’t be afraid to open unfinished pull requests or to ask questions if something is unclear!\n\n- No contribution is too small.\n- Try to limit each pull request to one change only (one bug fix, one new feature).\n- Always add tests and docstrings for your code.\n- Make sure your changes pass the continuous integration tests.\n\n## Code \u0026 docstrings\n\nCode follows [PEP 8](https://www.python.org/dev/peps/pep-0008/).\nIt is formatted (automatically, if you use the pre-commit hooks)\nto conform to the [`black`](https://github.com/psf/black) code style and import order\nwith a maximum line length of 88 characters.\n\nDocstrings follow [PEP 257](https://www.python.org/dev/peps/pep-0257/) and the [Google style](https://sphinxcontrib-napoleon.readthedocs.io/en/latest/example_google.html), with the exception of using section title `\"Arguments:\"` instead of `\"Args:\"`.\nArgument and return types are specified as type annotations and not included in the docstrings.\nExamples are formatted for testing by [`doctest`](https://docs.pytest.org).\nUnless the docstring fits in a single line, the `\"\"\"` are on separate lines.\n\n```python\ndef xyz_to_uv(xyz: np.ndarray) -\u003e np.ndarray:\n    \"\"\"\n    Convert world coordinates to image coordinates.\n\n    Arguments:\n        xyz: World coordinates (n, [x, y, z]).\n\n    Returns:\n        Image coordinates (n, 2).\n\n    Examples:\n        \u003e\u003e\u003e xyz = np.array([[0., 1., 0.]])\n        \u003e\u003e\u003e xyz_to_uv(xyz)\n        array([[ 50.,  50.]])\n    \"\"\"\n```\n\n## Tests\n\nUnit tests are written for [pytest](https://docs.pytest.org/en/latest/getting-started.html).\nAs with the rest of the code, they should include type annotations and [good docstrings](https://jml.io/test-docstrings).\n\nTo run the full test suite on the current Python version, simply run:\n\n```bash\nmake test\n```\n\nif you have `make` installed, or run the equivalent:\n\n```bash\npoetry run pytest --doctest-modules src tests\n```\n\nThe package manager [`poetry`](https://python-poetry.org) (see below) will manage the virtual environment and dependencies for you.\nTo easily install and switch between different Python versions,\nconsider using [`pyenv`](https://github.com/pyenv/pyenv).\n\n## Development environment\n\nBefore you begin, you will need to have [`gdal`](https://gdal.org/download.html#binaries),\na modern stable release of Python 3,\nand the package manager [`poetry`](https://python-poetry.org).\nFor example, using [`conda`](https://docs.conda.io/projects/conda/en/latest/user-guide/install):\n\n```bash\nconda activate base\nconda install -c conda-forge python=3.8 gdal=3.2.0 poetry=1\n```\n\nFirst, clone the `glimpse` repository and change into the newly created directory:\n\n```bash\ngit clone https://github.com/ezwelty/glimpse\ncd glimpse\n```\n\nUse `poetry` to install `glimpse` (and its dependencies) into a new virtual environment\nlinked to your current Python version:\n\n```bash\npoetry install\n```\n\nRun commands on this virtual environment using `poetry run`.\nFor example, run unit tests with:\n\n```\npoetry run pytest\n```\n\nor open a Python console with:\n\n```bash\npoetry run python\n```\n\nTo avoid committing code that breaks tests or violates the style guide,\nconsider installing [`pre-commit`](https://pre-commit.com) (if needed)\nand installing the hooks:\n\n```bash\npre-commit install\n```\n\nYou can run the pre-commit hooks anytime using:\n\n```bash\npre-commit run --all-files\n```\n\nOther useful commands are listed in the [`Makefile`](Makefile).\nFor example, to build the documentation:\n\n```bash\nmake docs\n# Equivalent to:\n# poetry run sphinx-build docs docs/build\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fezwelty%2Fglimpse","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fezwelty%2Fglimpse","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fezwelty%2Fglimpse/lists"}