01Live02Batch03About
/ Live

A real shot. A real run.
Statically rendered.

One real shot, scored end-to-end by the production pipeline. The fixture is regenerated by a script, never hand-edited.

Also builtbatch multi-shot scoring
group_1 · template_01
scout · 4017ms
SIFT + FLANN (Lowe 0.7, RANSAC)
Photo · Scoringdrag to compare
111122223333444455556666777788889999
photoscoring
real aligned photoshot at (0.45, 0.71)
Verdict
5.7/ 10
ring 5
conf high

Templatetemplate_01 · 1500×1500
AlignmentSIFT + FLANN (Lowe 0.7, RANSAC)
Centroid(674.2, 1067.7)
Distance326.6px
Ring width61.8px
Found new dark perforation in the lower portion of the target, appearing to be located between rings 5 and 6.
claude vision · scout4017ms · ROI only
Under the hood · live mode

Scored in four stages.
Each one does what it’s best at.

Live mode splits work between Claude Vision (judgment — “which hole is new?”) and OpenCV (precision — “exactly where?”). Scroll through the pipeline.

01
Align · OpenCV · no AI

Make the pixels match the template.

User photos are hand-held — tilted, zoomed, slightly rotated. Before anything else, SIFT feature-matches both frames against the reference and warps them into template space. Below: the raw phone photo (left) and the reference template (right), with green lines connecting the keypoints that survived Lowe’s ratio test and RANSAC.

Produces
Two rectified images, pixel-aligned with the template.
SIFT inlier keypoints between raw photo and reference template
sift keypoints · flann matcher · lowe 0.7 · ransac homography
02
Scout · Claude Vision

Which hole is new?

Claude receives both aligned frames and answers one question — where did a new perforation appear that wasn't there before? It returns a bounding box, not a score. We let Claude handle the semantic question and let pixel math handle geometry.

Produces
A bounding box from Claude (accent) + a 50%-padded search area (dashed) for the next stage.
PADDED ROI · ×1.5CLAUDE ROI
claude response

Found new dark perforation in the lower portion of the target, appearing to be located between rings 5 and 6.

claude vision · 4017ms · confidence high
03
Measure · OpenCV · no AI

Locate the centroid, sub-pixel.

Inside Claude's padded ROI, OpenCV differences the before/after frames. The brightest contiguous blob is the new hole; image moments yield its centroid below pixel precision. A signal-to-noise gate refuses to guess if the peak isn't cleanly above the noise floor.

Produces
Centroid at (674.2, 1067.7) in template-space.
CENTROID · (674.2, 1067.7)
pixel-difference · brightest contiguous blob · 1411px² · image-moments centroid
04
Score · arithmetic

Distance becomes a decimal.

Every template has known geometry — center pixel and outer-ring radius, derived once by Hough-circle detection. Score is the centroid's distance from centre, normalised by the outer ring. Printed ring positions are visual aids; the formula doesn't depend on how many are drawn.

distance = hypot(750 − 674.2, 750 − 1067.7) = 326.6pxscore = 10 × (1 − 326.6 / 618) = 5.7
Produces
score 5.7 · ring 5.
Aligned target with ring overlay and centroid distance line
distance326.6px · template space
outer radius618px
ring5
score5.7 / 10
Fallback · graceful degradation

LLM-only, when the pipeline can’t commit.

If alignment fails (too blurry, target cropped, extreme angle) or Measure rejects the ROI for low signal, the system falls back to asking Claude to score the whole image directly. Less accurate, but the user always gets something back.

Fallback · offline / no network

Pure OpenCV, no LLM in the loop.

Scoring also runs on pure OpenCV — same SIFT alignment, same per-shot temporal diff, no LLM calls. ~50ms per shot, comparable accuracy to the online pipeline on high-contrast targets; the LLM earns its keep on coloured substrates, where temporal diff alone struggles — substrate physics, not pipeline. Moving the OpenCV stack into the browser is non-trivial (~8 MB WASM blob, or a JS rewrite of the diff/contour code), so the web demo stays online-first; the natural home for offline is the iOS port, where on-device CV is free.