Skip to main content

Camera2Geo: camera to geographic space image conversion

PyPI version QGIS Plugin License: AGPL v3 codecov DOI

Camera2Geo converts raw drone or camera images into georeferenced GeoTIFFs via image metadata and a camera model. This can be helpful to quickly view individual aerial images in GIS software, label image features in geographic space, and view images in full resolution rather than in orthomosaic resolution. Most common drone sensors automatically work but custom implementations are possible.

Please cite as: Lindiwe, K., Percival, J. E. H., & Perroy, R. (2025). Camera2Geo. Zenodo. https://doi.org/10.5281/zenodo.17578622

Usage

QGIS

In QGIS 4.x, images can be converted from geotagged photo points and automatically added as a temporary layer. In addition, there is a processing tool that can handle bulk processing. qgis_usage.gif

Python

In python, there is a simple function to process many images at once using glob input/output. An example is available in example_python.py

from camera2geo import *

camera2geo(
    input_images="/input/folder/*.JPG",
    output_images= "/output/folder/$.TIF",
    epsg = 4326,
    correct_magnetic_declination = True,
    cog = True,
    image_equalize = False,
    lens_correction = True,
    projection = "point",
    elevation_surface = "local_file",
    elevation_file = "/input/dem.tif",
    no_data_value = 0,
    replace_nodata_value = 1,
)

CLI

In terminal, there is a simple fire based command line interface.

camera2geo \
  "/input/folder/*.JPG" \
  "/output/folder/$.TIF" \
  --epsg 4326 \
  --correct_magnetic_declination \
  --cog \
  --image_equalize \
  --lens_correction \
  --projection point \
  --elevation_surface local_file \
  --elevation_file /input/dem.tif \
  --no_data_value 0 \
  --replace_nodata_value 1

Functionality

camera2geo()

  1. Resolve Input Paths: Uses a glob pattern to search for one or many images.

  2. Read EXIF Metadata: Uses the pure-Python ExifRead package plus lightweight XMP parsing to extract GPS location, orientation, camera intrinsics, timestamp, and flight parameters.

  3. Determine Sensor Geometry: Includes camera presets for many popular drones that are automatically applied but the user can provide custom values.

  4. Elevation & Camera Pose Refinement (optional):

    • projection="point" samples terrain at the camera point and projects to a flat plane.
    • projection="mesh" intersects image rays against the elevation surface.
    • elevation_surface="local_file" uses a supplied raster path.
    • elevation_surface="opentopo_extent" downloads an OpenTopography SRTMGL1_E raster for a WGS84 bounding box and uses that surface.
    • If RTK sidecar files are detected, refine camera altitude/orientation.
  5. Image Correction & Enhancement (optional)

    • Lens distortion correction
    • Radiometric equalization
  6. Geographic Coordinate Conversion: Computes ground footprint and projection based on camera model, orientation, and elevation, then reprojects into the target EPSG.

  7. Output GeoTIFF Creation: Writes georeferenced TIFFs to the output directory; optionally writes as COG.

read_metadata()

Read metadata from one or more images with ExifRead and print the normalized metadata as YAML.

apply_metadata()

Apply or remove metadata on one or more images with exiv2. If output_images is not provided, edits are applied in-place; otherwise, input files are copied first.

search_cameras()

Look up cameras by maker and model.

search_lenses()

Look up lenses compatible with the given camera.

Installation

QGIS Plugin Installation

  1. Install QGIS

  2. System requirements: Before installing, ensure you have the following system-level prerequisites:

  • Python ≥ 3.10 and ≤ 3.12
  • PROJ ≥ 9.3
  • GDAL ≥ 3.10.2

QGIS Version: This plugin now targets QGIS 4.x only. Older QGIS releases are no longer supported.

Python dependencies: The plugin will attempt to automatically install all Python dependencies that it requires in the QGIS Python interpreter using QPIP. If it is unable to, the user must manually locate the QGIS python interpreter and install the libraries dependencies.

  1. Install camera2geo QGIS plugin:
  • Go to Plugins → Manage and Install Plugins…
  • Find camera2geo in the list, install, and enable it
  • Find the plugin in the toolbar to convert individual geophoto points temporarily or in the Processing Toolbox for bulk processing

Python Library and CLI Installation

  1. System requirements: Before installing, ensure you have the following system-level prerequisites:
  • Python ≥ 3.10 and ≤ 3.12
  • PROJ ≥ 9.3
  • GDAL ≥ 3.10.2
  • pip

An easy way to install these dependancies is to use Miniconda:

conda create -n camera2geo python=3.12 "gdal>=3.10.2" "proj>=9.3" -c conda-forge
conda activate camera2geo
  1. Install camera2geo: You can automatically install the library via PyPI. (this method installs only the core code as a library):
pip install camera2geo

This installs ExifRead for metadata reads and exiv2 for the optional metadata-writing helper.


Source Installation

  1. Clone the Repository
git clone https://github.com/cankanoa/camera2geo.git
cd camera2geo
  1. System requirements: Before installing, ensure you have the following system-level prerequisites:
  • Python ≥ 3.10 and ≤ 3.12
  • PROJ ≥ 9.3
  • GDAL = 3.10.2

An easy way to install these dependancies is to use Miniconda:

conda create -n camera2geo python=3.12 "gdal>=3.10.2" "proj>=9.3" -c conda-forge
conda activate camera2geo
  1. Install Dependancies: The pyproject.toml defines core dependancies to run the library.
pip install . # Normal dependencies
pip install -e ".[dev]"   # Developer dependencies

Development Guide

Contributing

All contributions are welcome. This library is licensed under a AGPL-3.0 license. Please be respectful when contributing. To suggest a feature please create an issue. Te report a bug please create an issue. To add code to the library, please create a pull request against main.

Code Formatting

This library uses black formatting. Pre commit will check formatting but if you want to manually you can use the following:

make check-format # Checks format
make format # Actually formats the code

Tests

All public functions in the Python library should have tests. They are automatically run when commiting to main and can be run locally with following command:

pytest

Building From Source

Use the following commands to build code:

make python-build # Python wheel
make qgis-build # Qgis zip plugin file

Publish to Github, Pypi, and QGIS

Publishing a new version to GitHub versions, Pypi library, and QGIS plugin is all done with the single command below. This will automatically make a GitHub tag which will trigger workflows for each publishing method.

make version version=1.2.3

Project Support

This library was developed at the Spatial Data Analysis and Visualization Lab (SDAV) at the University of Hawaii at Hilo by Kanoa Lindiwe. Funding was partly provided by the Hau‘oli Mau Loa Foundation, in addition to the National Science Foundation EPSCoR grant 2149133, Change Hawaiʻi: Harnessing the Data Revolution for Island Resilience.

Metadata

Release files for camera2geo 1.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for camera2geo 1.1.0
File Size Uploaded Provenance Actions
camera2geo-1.1.0.tar.gz 69.6 kB With provenance Details for camera2geo-1.1.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for camera2geo 1.1.0
File Interpreter ABI Platform Actions
camera2geo-1.1.0-py3-none-any.whl Python 3 none any Details for camera2geo-1.1.0-py3-none-any.whl

Total release size: 147.8 kB

Release files / camera2geo-1.1.0.tar.gz

Download URL camera2geo-1.1.0.tar.gz
Size 69.6 kB
Tags Source
SHA-256 checksum
How to use checksums
3c5a5e0ada61b6a23e473d387ffc736a78882247a63d75086ce427cd7174249c
BLAKE2b-256 checksum
How to use checksums
cfc904e46bb0ddfdceb0b1cb6957d58b53a28fff4576f6ca2208a926fd5ec2b8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jun 10, 2026.

Transparency log

Release files / camera2geo-1.1.0-py3-none-any.whl

Download URL camera2geo-1.1.0-py3-none-any.whl
Size 78.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
345698eed72515f807c80251e0983ce9b5af868d389c493dfcf5a7aef7eccd3e
BLAKE2b-256 checksum
How to use checksums
bdad5673723c3feff7c63b9e3471b8744147b2779289785d7b7dd9c35648ac54
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jun 10, 2026.

Transparency log

Security for camera2geo 1.1.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for camera2geo-1.1.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jun 10, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page