Broadcast fertilizer application treats a field as uniform, delivering the same rate to bare soil that it delivers to dense canopy. The waste is both economic and environmental, and the fix — applying only where plant material actually is — requires a perception system that runs in real time on a moving implement, outdoors, without a network connection or a depth sensor budget.
This work develops a perception-to-actuation pipeline that resolves canopy presence spatially and drives physical nozzles accordingly, using a single RGB camera on an NVIDIA Jetson. Monocular depth is estimated with a Dense Prediction Transformer (MiDaS DPT), which yields a relative inverse-depth map at frame rate without stereo rigs or LiDAR. Because that map is affine-invariant rather than metric, we introduce a single-reference calibration procedure that recovers an approximate physical distance from a power-law fit, giving the system a usable proximity signal from one measurement at a known 2 ft standoff. The depth map serves a second purpose: thresholded and morphologically cleaned, it suppresses background clutter before detection, so distant vegetation outside the treatment row cannot trigger a nozzle.
Canopy is then localized by a YOLOv8 detector fine-tuned on a custom canopy dataset. Rather than targeting individual plants — which would demand actuation precision the hardware does not have — detections are reduced to a union mask and integrated over three horizontal zones aligned with the physical nozzle bar. A zone opens when canopy covers more than 25% of it. This zone abstraction is the central design choice of the system: it degrades gracefully under partial or noisy detection, and it maps onto a handful of GPIO lines rather than a servo-aimed boom.
The full pipeline runs per frame on the Jetson under FP16 with fused detector layers, driving three GPIO outputs that correspond one-to-one with nozzle zones. We document the hardware bring-up path that produced this design, including an earlier two-pin combinatorial encoding that was replaced after it proved unable to represent simultaneously active zones without transient conflicts.