Conditions for a good measurement

What the camera has to see for a pulse to be readable, how the widget guides a person into position, and what a recorded file must satisfy.

Saphere reads a change of colour far too small for the eye. The conditions that make it readable are not preferences. Below them there is no signal to read, and no amount of computing brings one back.

This page lists the four conditions, and says what to do when they are not met.

The four conditions

Light must fall on the face. Daylight or room light, reasonably even, coming from the front. The usual mistake is the opposite arrangement: someone sitting with a bright window behind them appears as a dark shape, and a dark shape carries no signal. Harsh direct light and near-darkness fail for the same reason, at the two other ends of the range.

The person must stay still. Movement changes how much light reaches the skin, far more than a heartbeat does, and hides it. Breathing and small adjustments are fine. Turning, talking and walking are not.

The face must be uncovered. The measurement reads skin. Scarves, high collars, hats pulled down and masks remove exactly the areas it reads.

The face must be in the frame, at the right distance, with the upper chest visible. Roughly 40 to 60 cm from the camera, the camera at about face height, the person upright and facing it. The upper chest matters for the breathing rate, which is read from its movement.

Design for these conditions, do not merely state them

The widget’s first screens exist to explain these four points before the camera opens, in ten languages. If you replace those screens with your own wording, keep what they say. Once the camera is open, it also guides the person into position: see guiding the person into position.

When you send a recorded file

The API accepts a file you recorded yourself. Everything above still applies, with one difference that matters: nobody is guiding the person. Whatever framing was used is the framing you get, and a file that misses the conditions produces a measurement that fails at the end rather than a correction at the beginning.

RequirementValue
Duration30 seconds recommended; under 10 seconds the file is refused, and only about the first 30 seconds are read
Frame rate13 to 35 images per second; outside that range the file is refused
SizeUp to 100 MB
FramingUpright, facing the camera, camera at face height, upper chest visible — from the very first image, which is where the face is looked for
Distance40 to 60 cm
LightEven, neither harsh nor dim
MovementAs little as possible for the whole recording

The accepted file formats are listed on the measurements page.

When a measurement disappoints

A finished measurement carries its own explanation: a variable that could not be computed comes back with an error code naming the reason, rather than with a silent absence. That is the first place to look. The codes that point at the conditions above are these:

CodeWhat it saysWhat to change
CONFORMITY_FACE_PRESENCE, CONFORMITY_FACE_SIZEThe face was not found, or not properly in the frameCentre the face, fully visible, at the right distance
CONFORMITY_POOR_LIGHT, CONFORMITY_ONDULATIONSThe light was not good enoughMore light, falling on the face
CONFORMITY_MUCH_VARIATIONSToo much changed during the captureStay still, and keep the light steady
CONFORMITY_LOW_FPSThe camera delivered too few images per secondCharge the device, turn energy saving off, close other applications
CONFORMITY_MISSING_SIGNALNo usable signal came out of the captureMeasure again

The widget turns each of them into a short explanation on its result screen, in the person’s language.