Track a flat surface
track_planeTrack a flat surface in perspective as its four corners on every frame: a shipping label or a sheet in a hand, a phone or laptop screen, a sign, a box side, a poster, a wall or a floor. Seed it at source time at with corners (four source pixels in order top left, top right, bottom right, bottom left as the surface shows them there) or a box around it ([x0, y0, x1, y1], x1>x0, y1>y0) whose corners it finds when all four edges show there, or with fromProposal, a surface propose_surfaces found (its corners and seed time); the others null. Seed at a moment where the whole surface is in view, and check the corners on the sheet. Specify the source-time range, fps (null samples every frame of the footage on its own frame times, for a pin or a cover; 8 to look) and label. The corners keep their order however the surface turns; frames where it is hidden or out of the frame are marked lost, and it is taken again when it comes back. Bind a picture, a video, a component or a black-box region to it with . Coordinates are source pixels and times source seconds unless you say otherwise: pass points read off a preview with space preview and its previewId (the seed's time is then the preview's), film pixels with space film, and a film second with atSpace timeline. The answer ends with a json block giving the seed and the result in source, film and film_norm, with the source and timeline seconds, and warns about coordinates that look wrong. Every frame is checked: the answer gives a quality verdict, the flagged ranges (a corner drifting off the surface, a jump, the tracker unsure) and amber tiles on the sheet for them. Fix a flagged track with autoReseed true (it tracks those frames again from the last good frame), more seeds where the object looks different, or edit_track (free: it fixes a frame and fades the fix into its neighbours). read_track reads every frame's corners and quality. Uses about 38 credits a minute of the range, billed by the second. Read builtin-object-tracking first.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| at | Yes | ||
| box | Yes | A box around the surface, [x0, y0, x1, y1] in source pixels; null when corners are given. | |
| fps | Yes | Samples a second, 1 to 30. null samples every frame of the footage on its own frame times (every second frame of 50 or 60 fps footage): use it for a pin, a cover or a follow. 8 is enough to look. An fps above the footage's repeats frames. | |
| snap | Yes | true: move the seed onto the picture first (corners onto the surface's real corners, a box onto the object's edges, points onto the nearest corner), as the snap tool does; each move is in the answer, and a point with weak evidence stays put. Use it on corners read off a preview. null or false: the seed as given. | |
| label | Yes | ||
| seeds | Yes | More seeds besides at's, up to 8, in the call's space and atSpace: where the object looks different (it turns, comes back after leaving, changes size). Each seed is tracked to its neighbours and the walks are joined into one track where they meet, keeping the better frame. null tracks from at's seed alone. | |
| space | Yes | The space of this call's coordinates. null or source: pixels of the asset file. preview: pixels of a preview image you were shown, with previewId; its time is that preview's time. film: scene pixels from the frame's centre; film_norm: 0 to 1 of the frame; clip: the clip's own picture (with clipId). The tool converts them to the asset's pixels through the film's real transforms. | |
| clipId | Yes | The film clip that plays this asset, when space or atSpace needs one and several clips play it. null picks the clip that shows the asset at that time. | |
| detail | Yes | brief: the track id, its verdict and the flagged ranges, with no contact sheet. normal (null): the answer and its contact sheet. full: the same, as normal for now. | |
| assetId | Yes | ||
| atSpace | Yes | What this call's times are. null or source: seconds into the asset file. timeline: seconds of the film, read through the clip that plays the asset then (clipId to pick one). | |
| corners | Yes | The surface's four corners in source pixels, top left, top right, bottom right, bottom left as it shows them at at; null when a box or fromProposal is given. | |
| endTime | Yes | ||
| previewId | Yes | With space preview or preview_norm: the previewId the preview_frame, preview_range or preview_timeline answer printed. Else null. | |
| projectId | Yes | The project this call runs on without changing the open project. null (or leaving it out) uses the open project. wait_for_jobs takes the projectId of the calls that started the jobs. | |
| startTime | Yes | ||
| autoReseed | Yes | true: where the quality check flags frames (a corner drifting, a jump, the tracker unsure), track them again from the last good frame before them, and keep the better frames. The answer says where it reseeded. Each reseed uses credits for the frames it reads. null or false: no reseeding. | |
| snapRadius | Yes | How far snap may move a point, in source pixels, up to 64. null: 12. | |
| fromProposal | Yes | A proposal id from propose_surfaces ("sf_..."): the seed is its corners at its seed time, and at, corners and box are not read for it (pass null for corners and box). null: seed with corners or box. |