motion-tracking-from-video
Skill6 starsChanged 19 days agoMITView on GitHub
Measure what objects visibly do in a video - where each one moves, turns and grows, frame by frame - with picsart_media_track_motion, and turn the measurement into scene keyframes; then measure your own render the same way and compare the two with picsart_media_track_motion_diff. Covers choosing targets and estimators, tolerances, reading the result honestly, and placing tracked motion on a layer. Use when a scene must reproduce motion seen in a reference video, or when a render's motion must be checked against one.
In this repository67 other files it gives its agents.
- ai-presenterSkill
- animate-designSkill
- app-ui-animationSkill
- asset-auditSkill
- assetsSkill
- background-musicSkill
- caption-decorationsSkill
- character-riggingSkill
- custom-transitionsSkill
- design-layer-importSkill
- drama-series-writingSkill
- edit-footageSkill
- edit-on-your-computerSkill
- edit-pipelineSkill
- face-hidingSkill
- figma-storyboard-animationSkill
- film-animaticSkill
- film-cast-designSkill
- film-cuttingSkill
- film-finishingSkill
- film-shot-generationSkill
- film-story-writingSkill
- footage-analysisSkill
- footage-reframingSkill
- generate-mediaSkill
- get-startedSkill
- large-scene-assemblySkill
- linked-element-motionSkill
- make-characterSkill
- make-comicsSkill
- make-screen-videosSkill
- make-short-dramaSkill
- motion-design-craftSkill
- motion-intentSkill
- motion-pattern-librarySkill
- motion-reviewSkill
- motion-scene-continuitySkill
- movie-producerSkill
- open-picsart-appSkill
- photo-slideshowSkill
- picsart-add-mediaSkill
- picsart-video-rulesSkill
- quality-reviewSkill
- quick-merge-and-exportSkill
- realistic-color-gradeSkill
- recastSkill
- recreate-videoSkill
- reel-structureSkill
- reference-fragment-matchingSkill
- resting-frame-rulesSkill
- retention-hooksSkill
- scene-3d-authoringSkill
- scene-animation-referenceSkill
- scene-building-basicsSkill
- scene-template-remixSkill
- screen-recording-analysisSkill
- screen-recording-layoutsSkill
- screen-recording-zoomSkill
- screen-ui-redesignSkill
- sd25-peSkill
- The first 60 shown.
The file
We split this skill into the rules it gives an agent
6 rules. About 0 are common, 3 are distinctive, and 3 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈3
Distinctive · estimate
This author's own choices. Worth a look.
3
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 90
End the window before the object is covered: When it slides behind something, its confidence falls and its pose freezes.
- Distinctive: line 96
A track that is covered, then reacquired: After the confidence collapses, the later samples can be a valid track of the object that …
- Very specific: line 129
An expression: instead of keyframes means the channel fit one within tolerance: orbit (the path is a circle) or sine (a rotation that sways …
- Distinctive: line 142
Pixels: When the scene is not the reference's size, multiply each position by the scene's size over the reference's (the same factor on …
- Distinctive: line 147
Easing: keep each keyframe's easing where it is.
- Very specific: line 169
When a seam decision depends on a reference's velocity, path or overlap, the measurement feeds motion-scene-continuity (fetch with …
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Motion extraction
picsart_media_track_motion recovers what objects visibly do in a flattened video: their
position, rotation and scale on every frame, fitted into scene keyframes. It does not recover the
keyframes someone authored. It produces new motion data that reproduces what is on screen.
Looking decides what to track. The tracker measures where, every frame, to a fraction of a pixel. Never write a motion's numbers from a still or from memory: every timing and distance comes from a tracking result.
Cost and receipts
Neither picsart_media_track_motion nor picsart_media_track_motion_diff is a SPEND unless its
description says it charges (picsart-video-rules), so track as often as a beat needs. Each replies
with a job receipt by default: follow it as picsart-video-rules says. Targets that share a tracking window go in one call, as many as
its targets schema allows: one t0/t1 holds for every target, and each must be fully visible at
t0. A target that enters later, or is covered before t1, gets a call with its own window.
The method
- Look at the first frame of the window with
picsart_media_video_stills, and choose what to track. On a flat background,{ "auto": true, "max": 9 }finds the distinct objects att0and tracks each, ranked by how much they move. Objects that overlap merge into one, so give those a box each instead. - Track.
picsart_media_track_motionwith the video'ssource, the windowt0/t1in video seconds, andtargets: each onebbox([x, y, w, h]att0, in video pixels),points, orauto. Settolerancefor the source (below). - Read the result before you trust it. Per target it returns
animations(the fitted keyframes with their easing, or an expression),static(the channels that did not move),metawith each channel'smaxError, andnoteson anything that weakened the track.maxErroris the honest reconstruction error: a fit with a large one is an approximation, and you say so. - Place it on a layer (below), as keyframes with
timeMode: "layer". - Check it. Export your render of the same window, track it with the same targets, and compare
the two with
picsart_media_track_motion_diff(below).
What the tracker cannot see
It measures where texture goes, frame to frame. Some changes have no texture to follow:
| Change | What to do instead |
| a reveal: a wipe, a mask growing | cropped stills of the box, one per frame of the reveal, for its edge; track whatever drives the reveal |
| a fade or a twinkle | stills either side and through it; the tracker has no alpha (below) |
| non-rigid motion: a flap, a bend, a wobble | track the centre only, and build the shape change as a loop |
| a small idle loop: bobbing, swaying, breathing | track over several cycles, at least one and a half: a sway in rotation comes back as a sine expression; build any other loop from the cycles you measured |
| motion blur on a fast move | track the rests either side; the smeared frames between them are not measurements |
Illustrated templates
Stickers, doodles and cut-out shapes over a photo or a flat background:
- A sticker with a white border tracks best with
"estimator": "segmentation": the border is a clean silhouette, where its flat fill gives features little to hold.
Tolerance, per channel and per unit
tolerance is position in pixels, toleranceScale a ratio (default 0.01) and
toleranceRotation degrees (default 0.5). Never reuse a pixel tolerance for scale: 1.5
"pixels" once declared a 57% shrink static.
| Source | tolerance |
| a compressed reference video | about 1.5 (it measures to about 0.5–2 px) |
| your own render | 0.5 or less |
Too tight on a compressed source and the keyframes chase codec noise.
Choosing targets
- Start where the object is solid. During a fade-in its features are weak, the track dies on
the first frame and freezes. Start
t0once it is fully opaque. - A tight box inside the object's face. A box over a tilted card in a stack catches its neighbours, and the fit mixes two motions.
- Opaque objects only, for rotation and scale. A half-transparent object blends with whatever moves behind it, and its measured pose drifts toward that. Ghosts, depth-faded cards and translucent chrome give approximate motion at best; say so.
- Video playing inside the box: the features follow the content, not the box. Set
"estimator": "segmentation"on that target, which tracks the silhouette. Its centre leans toward bright content, so a still element of the same group, tracked instead, is more exact. - A rotating object takes a box, never points. A point tracks translation only: a corner
turning in place reads about 4 px wrong at 30°. A box in
similaritymode compensates. - End the window before the object is covered. When it slides behind something, its confidence
falls and its pose freezes. Shorten
t1and track again, rather than keep the frozen tail. - Coming in from off screen: while the object is clipped by the frame edge, its centre and scale are biased. Start once it is fully on screen.
- Clip the window, not the keyframes. A fit over frozen samples emits false keyframes at the
tail. Track again with an earlier
t1; never prune the keyframes by hand. - A track that is covered, then reacquired. After the confidence collapses, the later samples can be a valid track of the object that replaced it (a card becoming a chip). Check them against a still before discarding them.
- One object, two stretches that need different estimators (a video inside a card, then siblings touching it): track each stretch on its own, with one overlapping frame. The two estimators' reference points differ by about 2 px: measure that offset on the overlap frame and subtract it when you join them, and multiply the second stretch's scale by the overlap frame's scale.
| Content | mode | estimator |
| textured (a photo, a UI card with text) | similarity | features |
| flat or solid, or video inside the box | similarity | segmentation |
| stretched in perspective | corners | features |
| position alone matters | center | either |
Reading the result
- Position is the object's centre, in the video's own pixels. Under a layer's default anchor
(the centre of its box, for every content kind but text), that is the layer's
transform.position. Text anchors at its origin: place it by its alignment instead. - Rotation and scale are relative to
t0: 0° and 1.0 there. The tracker cannot know an object's tilt att0from one box: add the pose the layer starts at yourself. - Rotation is counter-clockwise positive; a scene's rotation is clockwise. A turn the tracker
reports as +12° is
-12in the scene. Flip the sign of every rotation value you place. - Scale comes as
[s, s], because a scene's scale is 2-D. - Keyframe times count from
t0unless the call setnormalizeTime: "absolute". - Easing is a preset or a fitted curve, chosen per segment. The closest of the four presets
(
linear,ease_in,ease_out,ease_in_out) comes first. When none of them fits withintolerance, the segment moves and it has enough samples, it gets a fitted curve instead:{"kind": "cubic_bezier", "control": [x1, y1, x2, y2]}, the scene's own parametric easing, with a y outside 0–1 for an overshoot. Copy either form into the keyframe as it came. A short segment keeps its closest preset, so a sharp snap or a long settle there reads close, not exact: itsmaxErrorsays how close; track it denser to give it a curve. - An expression instead of keyframes means the channel fit one within tolerance:
orbit(the path is a circle) orsine(a rotation that sways back and forth,meta'skindsays which). On a compressed reference real paths often are not pure circles, and the keyframes it falls back to are the honest answer, not a failure. - The tracker has no alpha. It cannot tell a fade from a move. Judge a fade on stills either side of it, and never invent one to cover a jump in pose.
Placing tracked motion on a layer
The result is in the reference's frame and time. A layer needs its own:
- Time. A keyframe's layer time is its tracked time, plus
t0when times count fromt0, plus the scene second where the reference's second 0 plays, minus the layer'sstart. - Pixels. When the scene is not the reference's size, multiply each position by the scene's size over the reference's (the same factor on both axes) and add the offset of where the reference's frame sits in the scene.
- Pose. Rotation: the layer's starting rotation minus the tracked value. Scale: the layer's starting scale times the tracked value.
- Easing: keep each keyframe's easing where it is; it shapes the segment that starts at it.
An expression is in the reference's time, and an orbit also in its pixels, so these rules cannot move it: when the scene differs from the reference in size or timing, track that object again as keyframes, or place it at the reference's size and time inside a composition sized like the reference.
Checking a render against the reference
Export your render over the fragment, track it with the same targets and the same mode, and pass
both tracking results to picsart_media_track_motion_diff with the target and the channel.
It returns maxDev, meanDev and worstT, the time where the two differ most. A number replaces
"it looks about right": tune until maxDev clears the threshold the use case sets.
- Like for like. The same targets, the same window, the same tolerance on both sides. Your render tracked from its own second 0 against the reference from its second 4 is a 4 s offset, not a mismatch.
- What the deviation says. A constant offset is geometry: a position or a size. A deviation that grows and shrinks along a move is easing. One that peaks at a beat's start or end is timing.
Measuring for a seam
When a seam decision depends on a reference's velocity, path or overlap, the measurement feeds
motion-scene-continuity (fetch with picsart_scene_recipe). Tracking answers what moved, where
and when; continuity judges what that movement communicates and whether the scene should preserve,
replace, interrupt or reset it. A close numeric fit does not by itself prove a readable handoff.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

