Read any analog gauge from a phone photo.
Dialed finds the dial, straightens it, unrolls the scale and reads the needle with OpenCV 5. Then an agent decides what happens next: log the reading, ask for a better photo, or hold a work order until someone signs it off.
- Reads
- Pressure and temperature dials with 180° to 300° scales
- Runs
- OpenCV 5 on AWS Lambda, coaching on your phone with OpenCV.js

- 1Found the dial
- 2Straightened it
- 3Unrolled the scale
- 4Read the needle
245psi
- 100% confidence
- 36° camera tilt corrected
- 13 scale numbers read
- 1565 ms to read
DAILY ROUND SHEET High-lift pump house, 07:00 round
| Tag | Service | Normal | Mon | Tue | Wed | Thu | Fri |
|---|---|---|---|---|---|---|---|
| PI-101 | Intake header | 1.2–2.4 bar | 1.8 | 1.9 | 1.8 | 1.7 | 1.8 |
| PI-102 | P-1 discharge | 7.0–9.5 bar | 8.4 | 8.6 | 8.3 | 8.5 | |
| TI-201 | P-1 bearing | 30–70 °C | 46 | 51 | 55 | 60 | 63 |
| PI-104 | F-1 inlet | 5.5–8.0 bar | 7.1 | 7.2 | 7.1 | 7.2 | |
| PI-105 | F-1 outlet | 4.5–7.5 bar | 6.5 | 6.3 | 6.2 | 6.? | 5.9 |
| PI-106 | Air receiver | 90–125 psi | 110 | 115 | 112 | 108 | 112 |
Checked: R.K.
The numbers were on the sheet. Nobody did the arithmetic.
This is how most plants still read their gauges: a clipboard, a pen and a walk. Look at TI-201. The bearing warmed seventeen degrees in five days, every reading written down, every one inside its band. It would have been noticed when the alarm went off.
- Readings are copied twice, from dial to sheet and from sheet to spreadsheet, if at all.
- Trends are invisible. A value can creep for a week without ever leaving the normal band.
- A blank is silent. Wednesday's PI-104 was never read, and nothing says so.
- Pairs go unchecked. The pressure drop across filter F-1 lives in two rows nobody subtracts.
Dialed reads the same dials from photos, keeps every reading with its evidence, and does the arithmetic on each one: band, drift, pairs.
Try it on a gauge
Drop a photo of any analog pressure or temperature gauge, or pick a sample. It's read live on AWS Lambda, and you can step through every stage of what OpenCV saw.
Or try a sample
Samples are real photos from Wikimedia Commons, read by eye for the known answer; credits appear with each result. Your own photo is read and discarded; nothing is stored.
How it reads a dial
Nine stages, all classical OpenCV 5 except the two small text models. Scroll through them on the photo from the top of the page; every drawing is the reader's own output.
Stage 1 of 9: Find the dial

- 01
Find the dial
Canny, findContours, fitEllipse
8 ellipses fitted to edge contours and bright or dark regions. Each is scored by how much of its outline lies on real edges, its size and its roundness; the red one won.
- 02
Edges
Sobel, Canny
Canny edges with thresholds taken from the gradient itself, so pale and dark scenes both work. The dial's rim is the longest closed curve.
- 03
Straighten
warpAffine
The ellipse becomes a circle: one affine warp undoes about 36° of camera tilt. Upright text stays upright.
- 04
True centre
connectedComponents, HoughLinesP, HoughCircles
The needle is a straight line through the pivot, and its hub was found on that line: that fixes the centre 15 px from the rim's centre (grey cross). The longer run from the pivot is the pointer, the shorter one its counterweight. Every angle is measured from here.
- 05
Strokes only
morphologyEx black-hat / top-hat
Black-hat (or top-hat on dark faces) keeps only strokes thinner than about a tenth of the radius: needle, ticks, numbers. Glare, shading and the face colour drop out, so the needle stands alone.
- 06
Unroll
warpPolar
The ring between the numbers and the rim is unwrapped into a straight strip around the true centre. The needle becomes one vertical line on a ruler, at 245 psi.
- 07
Read the numbers
dnn TextDetectionModel_DB, CRNN
24 text regions found by PP-OCRv3 (OpenCV 5's new DNN engine) and read by CRNN (classic engine), each in its own orientation, from a sharper straightened copy of the photo. 13 printed numbers agreed on one scale and were used; the rest were units, brand names or misreads.
- 08
Fit the scale
RANSAC, interpolation
Each number's angle and value. Each ring of numbers is fitted on its own (some dials print two scales); RANSAC throws out misreads and tries lost decimal points, then the value is interpolated between neighbouring numbers, which absorbs leftover perspective error.
- 09
Find the needle
polar ink profile
For every quarter degree, how much ink runs the whole inner band. The needle is the one angle where a stroke reaches from the hub to the ticks.
The agent's logic sheet
A model picks the next step from six tools. Guards written in code decide whether each step is allowed. What the camera measured changes every decision after it.
Its latest decisions on the sample round
The camera coaches the shot
Most bad readings start as bad photos. Before you press anything, OpenCV.js 5 runs in the phone's browser on every frame: it fits the dial's outline, measures how far you're standing off-axis, outlines reflections, checks focus and whether the phone is still.
- Tilt meter. An analog gauge of the camera's own angle, from the dial ellipse's axis ratio.
- Glare outlines. Blown-out highlights inside the dial are boxed in red, so you can step until they move off the needle.
- The shutter waits. It only lights up once all six checks have passed for half a second. You can still take it anyway.
- Nothing leaves the phone until you take the photo.
A round through a pump house
The sample plant is a water-works pump house: two high-lift pumps, a sand filter, an air receiver and eight gauges on one route. Every bubble is a gauge; filled bubbles were read today. Each gauge has a demo photo, so you can walk it from your desk.
Loading the live round…
Walk the roundA week on a round chart
Before data loggers, plants clipped paper discs into chart recorders that turned once a week. Each gauge in Dialed gets the same chart, drawn from its photographed readings.
This is TI-201, the P-1 bearing from the clipboard. The pen climbs the whole week without crossing the dashed alarm ring. The agent didn't wait for that: the trend passed 2 °C a day, so it held a work order with the evidence and the arithmetic attached.
Open TI-201's sheetAccuracy, measured
Scored on 340 gauges the confidence model never saw: 200 rendered ordinary photos, 100 rendered bad ones (up to 50° off-axis, heavy glare and blur), and 40 photos of real gauges from Wikimedia Commons, read by eye. Real photos are harder: the Evidence page keeps the development photos apart from the blind ones, and lists every failure.
- Accepted readings within 2% of the scale
- 98.7% of 231
- Accepted readings off by more than 5%
- 1
- Ordinary photos accepted first time
- 89%
- Development photos of real gauges read within 2%
- 19 of 37
Built with OpenCV 5 on AWS
OpenCV runs twice: in the browser to coach the shot, and in the cloud to read it. Everything else is ordinary serverless AWS.
- One function, cold start included. OpenCV 5 and both text models ship in the Lambda package; a warm read takes about two seconds on Lambda, most of it reading the printed numbers.
- Two DNN engines, each where it's faster. On CPU, OpenCV 5's new engine ran the text detector 2 to 4 times faster across our runs; the classic engine ran the recogniser 3 to 4 times faster.
- Repeatable. One CloudFormation template creates every resource; one script builds and deploys.
What it won't do
- It won't guess. Below 90% confidence there is no number, only a request for a better photo and the reason.
- It won't act alone on equipment. The agent can hold a work order; releasing it takes a person.
- It doesn't read digital displays, sight glasses or two-needle dials reliably yet, and vacuum scales with minus-sign labels need the gauge's registered range to be caught.
- It isn't a safety system. Alarms and trips stay where they are; Dialed replaces the clipboard, not the interlock.
