PitchTrack: the coach report, and the video behind it
Plateau United (NPFL) get a coach report after their home games, from a fixed three-lens rig on the stand with no camera operator. This page is the step after the report: OpenCV 5 on AWS EC2 turns a moment the report points at into a watchable follow shot. Plateau United 4-0 Kano Pillars, New Jos Stadium, 11 Oct 2026.
OpenCV …AWS EC2 · eu-north-13 × 3840×2160 lensesno motors, no camera operatorWhat the coach report said about this match
- Second half: Kano Pillars pushed Plateau back. Kano spent 63% of their time in Plateau's half against Plateau's 49%, a 15-point gap (95% interval 4–26). The first half was level.
- Possession, estimated: Plateau about 58% (interval 54–62): 65% before half-time, 45% after.
- Pressing level, at 12% vs 13% of nearby players closing down. Running speeds level, at 1.53 vs 1.50 m/s.
- Goals, from the official's record: 3', 45+3' (corner), 82', 90+4' (penalty). It agrees with the published 4-0.
The full report as the club received it: kamhq.com/plateau/2026-10-11-kano-pillars. It measures the team from player positions, with no player identity.
Watch it: three minutes, rendered on this server
Session clock 2640–2820 s: the build-up, the corner (watch the cut to the taker at the near flag at about 2780 s), Plateau's second goal (Ekundayo Ojo, 45+3') at about 2790 s, and the celebration at the bench. The camera chooses its own lens, aim and zoom. No one steered it.
Render a window yourself
This runs the same OpenCV 5 pipeline on the EC2 instance, live: three 4K decoders, the pitch homography, roll levelling, crop and warp, and an H.264 encode. One render runs at a time. A 20-second window takes about a minute on 2 vCPUs.
How it works
- Where the play is. We don't use the players' centroid, because it follows whichever lens happened to see more people. We use the point with the most players within 8 m, measured in metres on the pitch. It's gated so that a thin or jumpy reading never moves the camera.
- Which lens, and how much. That point goes through each lens's homography. The camera cuts to the lens that sees it best and zooms with distance, so far-side play gets a tighter crop than near-side play.
- Keeping it upright. Roll comes from the vertical vanishing point K·(r₁×r₂), taken from each lens's homography, not from the touchline, which slopes mostly because of perspective. At another ground it measured +6.0° and −6.6° on the outer lenses. This venue's calibration doesn't record the lens field of view, so levelling is switched off for this clip.
- Set pieces get a director. At a corner the taker stands 33–37 m from the crowd in the box, too far for one watchable frame. The footage is rendered after the match, so the delivery time is known: the moment the player on the corner arc moves off it. The camera cuts to the taker 4 s before that and back to the box as the ball arrives. In the final third the frame also widens (by up to 1.6×) to bring the edge of the box into shot. Against the official's record it found 5 of Plateau's 6 corners.
- Two resamples on purpose. First an area-filtered downscale of the bounding box, then a 1:1 rotation, so the grass doesn't shimmer.
What it does not do
- It follows the players' density peak, not the ball. Ball detection from this mast covers only part of the match, so a long ball can run ahead of the shot.
- Detection and tracking ran on the laptop GPU. This server takes their output in metres and does all the pixel work. The detector doesn't run in the cloud yet.
- It's post-match, not live. A render at full resolution is faster than real time on the laptop (35–53 fps) and slower on 2 vCPUs.
- The calibration was fitted to the painted lines on a median frame. From a low stand the far half covers only a thin strip of each frame, so positions there are coarse.
Kam Labs, Jos, Nigeria · OpenCV AI Competition 2026 entry · Technical report · /api/health