Skip to content

Annotating Shots

Annotation is the human check on the contact frame. Even with automatic detection, human confirmation is the accuracy ceiling of the system — so this screen is permanent, not a stopgap.

  1. Tap Footage from the home screen
  2. Find a footage card showing Needs annotation
  3. Tap Annotate contact frames

Only unconfirmed, non-excluded shots enter the queue, ordered by contact frame. Returning to a half-annotated set resumes where the work remains.

The title bar shows progress: Annotate · 3 of 47.

Landscape, split into two panes.

  • Large preview of the currently selected frame
  • Frame number and exact time below it, plus an amber offset (e.g. +3) if you have moved off the original candidate
  • Filmstrip of 17 thumbnails spanning ±8 frames around the candidate

Filmstrip borders tell you where you are:

BorderMeaning
Blue, thickYour current selection
AmberThe original detector candidate
Thin whiteEverything else

Tap a thumbnail to select it. The and chevrons shift the window by 8 frames.

Under the heading Where did it go?, a court map laid out as the real court. For badminton singles that is 2 rows × 3 columns: Front Left, Front Centre, Front Right, Back Left, Back Centre, Back Right.

One tap selects. The selected tile turns blue.

ButtonEffect
Confirm (green)Saves the frame and zone, marks the shot human-confirmed, advances. Disabled until a zone is selected
Skip (grey)Leaves the shot unconfirmed and advances. It reappears next time
Exclude (red)Rejects the shot permanently. The record is kept, but it never enters a session
Previous (title bar)Goes back one shot

All three actions auto-advance — there is no separate “next” button.

Target is 5 seconds per shot once you find the rhythm.

The app times you and reports the median when you finish — a green toast like “Median per shot: 4.2 s”. If the median exceeds 8 seconds it turns red and adds: “Median above 8 s — the annotation UI needs work, not you.”

That attribution is correct. If annotation is slow, report it as an interface problem.

On confirmation, contact_time_ms is recomputed from the frame number and the real frame rate rather than trusted from elsewhere, so frame and time can never disagree. The detector source is rewritten to manual with confidence 1.0.