Skip to content


Switch branches/tags


Failed to load latest commit information.
Latest commit message
Commit time

Heartbeat: Measuring heart rate using remote photoplethysmography (rPPG)

This is a simple implementation of rPPG, a way to measure heart rate without skin contact. It uses a video recording or live feed of the face to analyse subtle changes in skin color.

Here's how it works:

  • The face is detected and continuously tracked
  • Signal series is obtained by determining the facial color in every frame
  • Heart rate is estimated using frequency analysis and filtering of the series

If you are interested in the specifics, feel free to have a read of my publications on the topic:

See also my minimal JavaScript implementation and Browser Demo.



The following libraries are required to run Heartbeat:

They must be installed on the system such that headers and libraries are found on the compiler's standard search path.


For building a Makefile is available that works on macOS:

$ make

Alternative compilation for Ubuntu. Works with opencv 3.1:

$ g++ -std=c++11 Heartbeat.cpp opencv.cpp RPPG.cpp `pkg-config --cflags --libs opencv` -o Heartbeat


After building, the app can be run via

$ ./Heartbeat

Several command line arguments are available:

Argument Options Description
-i Filepath to input video Omit flag to use webcam
-rppg g, pca (default: g) Specify rPPG algorithm variant - only green channel or rgb channels with pca
-facedet haar, deep (default: haar) Specify face detection classifier - Haar cascade or deep neural network
-r Re-detection interval (default: 1 s) Interval for face re-detection; tracking is used frame-to-frame
-f Sampling frequency (default: 1 Hz) Frequency for heart rate estimation
-max default: 5 Maximum size of signal sliding window
-min default: 5 Minimum size of signal sliding window
-gui true, false (default: true) Display the GUI
-log true, false (default: false) Detailed logging
-ds default: 1 If using video from file: Downsample by using every ith frame