UAV imagery to mesh
Vadstena pipeline
This pipeline processes UAV captured imagery(with certain metadata) to a 3D ouput scene represented by point cloud and true ortho.
Input
The UAV pipeline is currently designed to process single-camera, single-flight line imagery.
When creating an asset, the assetType UAV_IMAGES_UPLOAD
should be used. The groupedAssetId returned when creating the asset should be saved to trigger the pipeline.
How to create and upload an asset on HxDR using GraphQL API ?→
RGB images:
- 8bit JPEG high quality (QFactor>=95, must be free of JPEG artefacts)
File structure:
- A single directory containing all images
- Ideally, the alphabetic order of image filenames should correspond to capture timestamps
Note that the UAV processing pipeline can process input datasets with a maximum of ~2000 JPEG images.
Camera Intrinsics
Some information about the employed camera is extracted from the EXIF header of the supplied imagery.
The following fields are required:
- Focal Length
(0x920a FocalLength)
- Focal Length in 35mm
(0xa405 FocalLengthIn35mmFormat)
The following fields are preferred to be included, but not critical:
- Manufacturer
- Model
GNSS + RTK positioning
GNSS positions of individual image captures are extracted from the EXIF header or preferably from the XMP header of supplied images if present.
Latitude and longitude refs are always parsed from EXIF, so the following tags are always required:
- GPS Latitude Ref
(0x0001 GPSLatitudeRef)
- GPS Longitude Ref
(0x0003 GPSLongitudeRef)
Then, it is required that at least one of the following set of tags is present (if multiple, XMP is always preferred over EXIF):
- EXIF tags in GPS IFD
- GPS Latitude
(0x0002 GPSLatitude)
- GPS Longitude
(0x0004 GPSLongitude)
- GPS Altitude
(0x0006 GPSAltitude)
- GPS Latitude
- DJI tags in XMP header:
drone-dji:GpsLatitude
drone-dji:GpsLongtitude
drone-dji:AbsoluteAltitude
- Hexagon tags in XMP header:
prefix2:Latitude
prefix2:Longitude
prefix2:EllipsoidalHeight
Capture
Both nadir and oblique images are supported and can be mixed in a single flight line. However, datasets including images looking at the horizon are not yet supported.
Only images overlapping the AOI should be provided for processing.
Processing
Once the asset upload is completed the following mutation can be used, make sure to use the correct groupedAssetId and EPSG code:
mutation MyMutationName {
triggerUavProcessing(
params: {
groupedAssetId: "[groupedAssetId]"
outputProjection: "EPSG:8726"
}
) {
... on TriggerProcessingOutput {
__typename
success
}
... on BaseProcessingErrorInterface {
__typename
message
}
}
}
A GroupedAsset is a symbolic link to the underneath Asset and the files connected to it. Every grouped asset gets an ID, when it is created. This groupedAssetId for the input images as single asset is used here to triggger the mesh generation.
Output
Once the processing is triggered, certain artefacts and addresses will be made available for the asset. However, once the processingPipelineInfo.status is SUCCESS, the output files will be available for download.
- For the point cloud: artefacts with dataCategory:POINT_CLOUD and Address serviceType:LAS
- For the TrueOrtho: artefacts with dataCategory:IMAGE_2D_ORTHO and Address serviceType:GEOTIFF