Ingest and photogrammetry

On this page 10

Frames and a flight log go in. Georeferenced, calibrated raster layers come out. This is the stage that is normally rented per hectare, and the one where the open source alternatives are strongest.

Geotagging

StepDetail
MatchShutter trigger events in the flight log to frame files, in order, with a count check
InterpolateThe exposure falls between GNSS epochs. Interpolate the trajectory to the exposure timestamp
Lever armApply the measured offset from the GNSS antenna phase centre to the camera's optical centre
AttitudeRecord roll, pitch and yaw at exposure, for projecting the frame footprint
WriteEXIF GPS tags plus a sidecar with the full pose and its uncertainty

See Positioning. The lever arm is the step everybody skips and it is systematic, so it does not average out.

Radiometric calibration, for multispectral

Run this before anything else touches the pixels.

  1. Dark current and vignetting, per band, from the camera's calibration data.
  2. Panel calibration: the reflectance panel imaged before and after the flight gives the digital-number to reflectance scaling.
  3. Downwelling correction: the light sensor's per-frame irradiance handles cloud passing during the flight.
  4. Band alignment: separate lenses see slightly different scenes. Register the bands with feature matching before computing any index.

The reference implementation everybody learns from is MicaSense's own imageprocessing notebooks. Read them, then write your own, because the discipline has to fit your workflow.

Without this, a "change layer" is largely a record of the weather. See disease detection.

Photogrammetry

OptionLicenceNotes
OpenDroneMap via NodeODMAGPL-3.0The complete pipeline: ortho, DSM, DTM, point cloud, multispectral support. Run it unmodified as a batch job
COLMAPBSDStructure from motion, permissive, excellent
OpenMVSAGPL-3.0Dense reconstruction. Check the licence against your product
OpenMVGMPL-2.0Permissive alternative for SfM
MicMacCeCILL-BFrench national survey institute, permissive-ish, capable

The AGPL question matters. Running unmodified ODM as an internal batch job that produces files you then serve is the ordinary, uncontroversial path. Modifying ODM and exposing it to customers over a network is where the network clause bites. Decide this before the integration exists. See the licence table.

Getting a good reconstruction

ParameterValueConsequence of getting it wrong
Forward overlap75 to 80%Below 70%, reconstruction fails over uniform canopy
Side overlap65 to 70%Stripes and holes
Altitude consistencyTerrain followingVarying ground resolution across the field
Shutter1/1000 s or fasterMotion blur that no processing recovers
Sun angleConsistent, avoid low sunLong shadows dominate the model
Ground controlRTK plus 3 to 5 independent checkpointsYou never find out the base coordinate was wrong

Runtime

Roughly 600 frames from 25 ha at 2.5 cm/px is 30 to 60 minutes on a mid-range GPU box. Plan the pipeline as a queue with retries, not as a synchronous request: a stitch that fails at minute 40 must not lose the flight.

Raster derivatives

All of it is GDAL and numpy, and none of it needs a licence.

LayerToolNote
OrthomosaicODM output, or per-frame projectionFor many capabilities per-frame is enough. See below
DSM and DTMODM, or PDAL from the point cloudThe DTM is what drainage needs
Slope, aspectgdaldemOne command
Flow accumulation, depressionsWhiteboxTools, pysheds, GRASS r.watershedThe drainage layer
Vegetation indicesrasterio plus numpyArithmetic
ReprojectionPROJ via pyproj or gdalwarp
Web imageryCloud Optimized GeoTIFF plus overviewsSee Platform

You often do not need a mosaic

A full photogrammetric stitch is expensive and, for several capabilities, unnecessary. If every frame has an accurate pose, you can project its corners onto the ground and place detections in field coordinates directly, then deduplicate across overlap.

CapabilityNeeds a stitch?
Field mappingYes. The stitch is the product
Disease, fertilisationYes, for continuous index maps
Weed controlNo. Detections in field space are enough
PestNo, on a fixed route
WildlifeNo. Points, not pictures
Yield countingNo, with careful de-duplication
IrrigationYes, and use RGB frames to solve the geometry for the thermal ones

Skipping the mosaic where it is not needed is the single largest processing cost saving available, and it also removes hours of latency between landing and a usable result.

Thermal alignment

Thermal frames over a uniform canopy have almost no features to match, so they mosaic badly on their own. Fly an RGB camera alongside, solve the geometry from the RGB frames, and apply that solution to the thermal frames using the fixed transform between the two. It is the most useful trick in the whole thermal pipeline.

Publishing a stitch to the site

The web derivative, not the master:

gdal_translate -of WEBP -outsize 3000 0 -co QUALITY=82 ortho.tif ortho-web.webp

Then attach it to the flight record, with the footprint in the field's normalised space:

buddy imagery:attach ./ortho-web.webp --bounds="-0.04,-0.03,1.05,1.02" --resolution 4

The footprint comes out of the GeoTIFF rather than being guessed: read the geotransform, express the image's corners in the field's own bounding box, and that is your minX,minY,maxX,maxY. See The field map for why the equals sign is required and why the bounds matter.

Quality gates

Write these as automated checks that fail the flight rather than as things somebody notices later:

CheckFails when
Frame count against trigger countA card wrote fewer frames than the aircraft triggered
Pose coverageAny frame without an interpolated pose
RTK fix ratioLess than 95% of frames on a fixed solution
Checkpoint residualAbove the tolerance for the capability
Reconstruction coverageHoles inside the boundary
Calibration presentA multispectral flight with no panel capture
Ground resolutionAchieved GSD outside the planned range

A flight that fails a gate is reflown. That is far cheaper than a prescription built on a bad map, and the customer never sees it.