Noninvasive Heart Rate Estimation Using Consumer Cameras
Digital Signal Processing | April 2026
Digital Signal Processing | April 2026
This project focused on developing a noncontact method for estimating heart rate using video from a consumer smartphone camera. The approach uses remote photoplethysmography (rPPG), which detects subtle changes in facial skin intensity caused by changes in blood volume during each heartbeat.
The system processes recorded video by selecting a region of interest (ROI) on the forehead, spatially averaging the green-channel intensity, filtering the resulting time-domain signal, and analyzing it in the frequency domain. The dominant cardiac frequency is then identified and converted to beats per minute (BPM).
The completed system was evaluated using 20 thirty-second video recordings captured at 30 frames per second under controlled lighting conditions. Reference heart rates were obtained through manual pulse measurements or wearable devices. The video processing and signal analysis were implemented in MATLAB, and the system achieved an average estimation error of 5.02% across the dataset.
Develop a video processing pipeline to estimate heart rate from facial skin color variations.
Extract a usable one-dimensional photoplethysmographic (PPG) signal from RGB video frames.
Apply digital filtering techniques to remove noise and motion artifacts.
Identify heart rate by finding the dominant cardiac frequency component in the signal spectrum.
Evaluate system accuracy against manually measured and wearable-device heart rate references.
The system used a smartphone camera operating at 30 frames per second, limiting the available sampling frequency. Recordings were collected with subjects facing the camera, their foreheads visible, and limited movement under well-lit conditions.
A primary challenge was extracting the relatively small changes associated with blood volume from camera data while minimizing the effects of motion, lighting variations, and other sources of noise. These factors can introduce unwanted components into the extracted signal and interfere with heart-rate detection.
The algorithm was designed to detect heart rates from 45–200 BPM, corresponding to 0.75–3.33 Hz. This range defined the frequency band used during filtering and heart-rate detection.
The processing pipeline was implemented in MATLAB, where the recorded video data was processed to extract the green-channel signal, apply the Butterworth filter, perform the DFT, and estimate the corresponding heart rate.
Figure 1: The processing pipline developed for this project.
Each video frame contains red, green, and blue color channels. I chose to analyize the green channel because of its higher sensitivity to blood volume variations, allowing the small intensity changes associated with the cardiac signal to be extracted.
A rectangular ROI was then selected on each of the subject's forehead. The forehead provided the most uniform visible skin region that could be used consistently throughout the recordings. Limiting the analysis to this region also allowed the algorithm to focus on the facial skin signal rather than processing the entire frame.
Instead of relying on a single pixel, the intensity of all pixels within the ROI was averaged for each frame. This produces a single intensity value per frame while reducing the influence of individual-pixel variations.
This equation defines the spatial averaging used to generate the discrete-time signal y[n], where W and H are the ROI dimensions and I(j,i,2) represents the green-channel intensity at each pixel. The implemented ROI was 100 × 80 pixels.
Figure 2: Two recordings of participants with the region of interest (ROI) indicated by the green box on the forehead (Note: participants faces blurred for privacy).
The extracted signal contains components unrelated to the heartbeat, including DC offsets from static skin color and ambient lighting, low-frequency variations from breathing and body movement, and higher-frequency sensor noise.
A 2nd-order Butterworth bandpass filter was used because of its flat passband response, which avoids ripple within the frequencies being analyzed. The filter was configured for 0.75–3.33 Hz (45–200 BPM) to isolate the selected physiological range.
The lower cutoff removes the DC component and slower respiratory variations, while the upper cutoff removes high-frequency sensor noise while retaining the selected heart-rate range.
The filter was applied in both the forward and reverse directions to eliminate phase shift before frequency-domain analysis. This also squares the filter magnitude response and effectively doubles the filter order, providing the attenuation characteristics of a 4th-order filter.
Figure 3: The total System Magnitude Response and Phase correction plots.
After filtering, the resulting signal was transformed from the time domain to the frequency domain using the Discrete Fourier Transform (DFT). This allows the periodic cardiac component to be identified as a peak in the frequency spectrum.
This equation defines the DFT used to transform the filtered signal s[n] into its frequency-domain representation X[k], where N is the number of samples and k is the frequency index.
The magnitude spectrum was then examined within the cardiac frequency range. A threshold equal to 32% of the maximum spectral magnitude was used to eliminate weaker components. When multiple qualifying peaks were present, the highest-frequency peak within the cardiac range was selected to reduce the influence of lower-frequency components such as respiratory variations.
If no peak exceeded the threshold, a fallback routine selected the largest magnitude within the cardiac range so that the algorithm could still produce a heart-rate estimate.
This equation converts the selected cardiac frequency index kcard into BPM using the sampling frequency fs and the number of samples N.
The final system was evaluated using 20 thirty-second video recordings captured under controlled lighting conditions. Ground-truth heart rates were obtained through manual pulse measurements or wearable devices.
The system achieved an average estimation error of 5.02%, with most recordings producing errors between approximately 2% and 8%. Several recordings showed very close agreement with the reference measurements, including: 86.0 BPM estimated vs. 86.1 BPM reference (0.11% error) and 95.0 BPM estimated vs. 96.0 BPM reference (approximately 1% error).
Figure 4: Results of the DSP heart rate detection and corresponding percent error.
Figure 5: The plotted reference BPM with the algorithm’s BPM (top) and the percent error plot (bottom).
Performance was most accurate under stable recording conditions, while motion, inconsistent lighting, and ROI instability contributed to larger errors in some recordings. These results identified the primary areas for future improvement.
Figure 6: The result of Rec_5.mov (only 2.61% error).
Figure 7: The result of recording_3.mov (only 0.11% error).
This project demonstrated a complete camera-based signal-processing approach for estimating heart rate from facial video. The combination of forehead ROI extraction, green-channel spatial averaging, Butterworth filtering, DFT analysis, and peak detection produced an average estimation error of 5.02% across the 20 recordings.
The results showed close agreement with reference measurements under stable recording conditions, while motion, lighting variations, and unstable ROI selection contributed to the largest errors.
Future improvements would focus on making the system more robust to these conditions. Potential areas include improved ROI tracking, better motion-artifact removal, and testing under less controlled lighting and movement conditions.