diff --git a/heartRateEstimation.m b/heartRateEstimation.m index 3fd51f9..8dde60a 100644 --- a/heartRateEstimation.m +++ b/heartRateEstimation.m @@ -2,16 +2,14 @@ %%%%%%%%%%%%%%%%% % hr = heartRateEstimation(imgDirectory, fps, windowDuration, windowShift) % -% Task: +% Task: Finding the heartrate of person from selcted images % % Inputs: % -imgDirectory -% -fps -% -windowDuration -% -windowShift +% -fps % % Output: -% -hr: +% -heartrate: % % Author: Thomas Périn % Date: 17/02/2023 @@ -22,11 +20,9 @@ clc clear all -%temp var -%imgDirectory = 'img'; +% temp var fps = 15; windowDuration = 30; -windowShift = 1; roi = [280 580 600 850]; % global @@ -34,20 +30,16 @@ redChannel = []; greenChannel = []; blueChannel = []; -%list the images -%listImg = dir([imgDirectory '/*.png']); +%list the images with i the same directory listImg = dir(['*.png']); +% iteration for every images available for l_img=1:windowDuration*fps % load the current image - %image_original = imread([imgDirectory '/' listImg(l_img).name]); image_original = imread([listImg(l_img).name]); - %image(image_original); - %imshow([listImg(l_img).name]) % crop the current image around the face image_face = image_original(roi(1):roi(2), roi(3):roi(4), :); - %image(image_face); % spatial average for r, g, b channels r_mean = mean(mean(image_face(:,:,1))); @@ -69,15 +61,16 @@ blueChannel_avg = mean(blueChannel); blueChannel_std = std(blueChannel); % normalize your data -%first define length of our data +% first define length of our data L = columns(greenChannel); for i=1:L greenChannel_normalized(i) = (greenChannel(i) - greenChannel_avg)/greenChannel_std; end +% select only greenChannel for simplicity (no ICA) greenChannel_fft = fft(greenChannel_normalized); -% power spectrum (https://www.mathworks.com/help/matlab/ref/fft.html) +% power spectrum using link(https://www.mathworks.com/help/matlab/ref/fft.html) P2 = abs(greenChannel_fft/L); P1 = P2(1:L/2+1); P1(2:end-1) = 2*P1(2:end-1); @@ -85,21 +78,14 @@ f = 15*(0:(L/2))/L; plot(f,P1) % find the peak in the range ([0.75 4] Hz) -% max -> value, index - -low_index = 0.75*L/15+0.5 -high_index = 2*L/15 -a = max(P1(low_index:high_index)) -heart_rate = f(a) - - -% convert the index from Hz to bpm +% define range and round to get intergers +low_index = round(0.75*L/15); +high_index = round(2*L/15); +% find max value and index inn new range +[a, ia] = max(P1(low_index:high_index)); +% adapt the index for full range +heart_frequency = f(ia+low_index) % determine heart rate - - - - - - - +% convert the index from Hz to bpm +heart_rate = heart_frequency*60