A QGIS plugin for performing photogrammetric bundle adjustment from image measurements and ground control points (GCPs).
The plugin estimates exterior orientation parameters (EOPs) for a block of photographs using image observations, camera calibration parameters, and ground control information. Results can be visualized directly within QGIS as temporary layers.
- Import image observations from a point layer
- Import ground control points from a point layer
- Configure camera calibration parameters
- Estimate initial exterior orientation parameters
- Perform bundle adjustment
- Visualize adjusted camera stations as a temporary point layer
- Visualize photo footprints as a temporary polygon layer
- Operate entirely within QGIS
- QGIS 3.44 or later
- NumPy
- PyQt5
The plugin uses only the Python environment bundled with QGIS and does not require additional dependencies.
The GCP layer must be a point layer containing:
| Field | Description |
|---|---|
| ID | Unique point identifier |
The geometry coordinates provide the X, Y, and Z coordinates of each control point.
The image measurement layer must be a point layer containing:
| Field | Description |
|---|---|
| ID | Point identifier |
| Photo | Photo identifier |
Each feature represents a measured image point.
Points sharing the same ID are assumed to correspond to the same object point observed in different photographs.
The following camera parameters can be configured:
- Image width (pixels)
- Image height (pixels)
- Pixel size (mm)
- Focal length (mm)
- Principal point X coordinate (mm)
- Principal point Y coordinate (mm)
- K₀
- K₁
- K₂
Standard deviations can be specified for:
- Focal length
- Principal point coordinates
- Radial distortion coefficients
- Open the plugin from the QGIS toolbar or Plugins menu.
- Select the image point layer.
- Select the image point ID field.
- Select the photo name field.
- Select the GCP layer.
- Select the GCP ID field.
- Enter the camera parameters.
- Run the adjustment.
After processing, the plugin will create temporary layers containing:
- Adjusted camera positions
- Photo footprints
A temporary PointZ layer containing:
- Photo identifier
- Camera coordinates (X, Y, Z)
- Omega
- Phi
- Kappa
A temporary polygon layer containing the estimated footprint of each photograph at mean terrain height.
Output layers are created using the same CRS as the selected GCP layer.
It is assumed that the GCP coordinates and the resulting bundle adjustment solution are expressed in this CRS.
Plugin structure:
qgis-plugin/
├── __init__.py
├── plugin.py
├── metadata.txt
├── assets/
│ └── icon.png
├── dialog/
│ ├── __init__.py
│ ├── dialog.py
│ └── dialog.ui
└── core/
├── __init__.py
├── bba.py
└── camera.py
The graphical interface is defined in a Qt Designer .ui file and loaded dynamically at runtime.