version 1.1

This commit is contained in:
Vattana 2023-02-19 18:29:52 +01:00
parent eb4e66089b
commit 8e6eb7f664
7 changed files with 147 additions and 5 deletions

View File

@ -0,0 +1,20 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Image extraction code
%
% Author:LY Pechvattana, MINH Meng Hour
% Date: 19/02/2023
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function v = imgex[]
video
v = VideoReader('code.avi');
n = 1;
while hasFrame(v)
img = readFrame(v);
imwrite(img,strcat('image',num2str(n),'.png'));
n = n+1
end
n=n-1;

View File

@ -1,4 +1,14 @@
v = VideoReader('code.avi'); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Image extraction code
%
% Author:LY Pechvattana, MINH Meng Hour
% Date: 19/02/2023
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function v = imageextract(vid)
vid = 'code.avi'
v = VideoReader(vid);
n = 1; n = 1;
while hasFrame(v) while hasFrame(v)

97
heartrate/main.asv Normal file
View File

@ -0,0 +1,97 @@
%set variable
fps = 15;
windowDuration = 30;
windowShift = 1;
roi = [310 126 114 54];
imgDirectory = 'images';
%global
redChannel = [];
greenChannel = [];
blueChannel = [];
%list the images
listImg = dir([imgDirectory '/*.png']);
for l_img=1:windowDuration*fps
% load the current image
image_orginal = imread([imgDirectory '/' listImg(l_img).name]);
image_face = imcrop(image_orginal,roi);
%spatial average for r, g, b channels
[r g b]=imsplit(image_face);
r_mean = mean2(r);
g_mean = mean2(g);
b_mean = mean2(b);
% store the current "average" pixel in global arrays
redChannel = [redChannel r_mean];
greenChannel = [greenChannel g_mean];
blueChannel = [blueChannel b_mean];
end
% estimate temporal average and standard deviation
greenChannel_avg = mean(greenChannel);
greenChannel_std = std(greenChannel);
%normalization
for i = 1:450
greenChannel_normal(i) = (greenChannel(i)-greenChannel_avg);
end
%Fast Fourier transform (fft) of Green Channel
greenChannel_fft = fft(greenChannel_normal);
%power spectrum P1
L = length(greenChannel_normal);
P2 = abs(greenChannel_fft/L);
P1 = P2(1:L/2+1);
P1(2:end-1)=2*P1(2:end-1);
f = 15*(0:(L/2))/L;
P1 = fftshift(P1);
plot(f,P1);
title("Power Spectrum")
xlabel("f (Hz)")
ylabel("Power Spectrum (f)")
%peak - compute the freq vector
[m n]=size(P1);
x = 1:n;
y= 1:m;
[X Y]=meshgrid(x, y);
X = X - floor(n/2)-1;
Y = Y - floor(m/2)-1;
f = sqrt(X.^2 + Y.^2);
%peak - find the peak in range
indices = (f>=0.75)&(f<=4);
[peaks locations] = findpeaks(P1(indices), 'SortStr','descend');
location = locations(1);
peak_frequency = f(indices);
peak_frequency = peak_frequency(location);
heartrate = peak_frequency.*60;
disp(['Heart rate: ', num2str(heartrate), ' bpm']);
%plotting RGB
figure(2)
subplot(2,2,1);
plot(redChannel);
title('Red Channel', "-r");
subplot(2,2,2);
plot(greenChannel);
title('Green Channel');
subplot(2,2,3);
plot(blueChannel);
title('Blue Channel');

View File

@ -57,8 +57,8 @@ P1 = fftshift(P1);
plot(f,P1); plot(f,P1);
title("Power Spectrum") title("Power Spectrum")
xlabel("f (Hz)") xlabel("frequency (Hz)")
ylabel("Power Spectrum (f)") ylabel("Power Spectrum")
%peak - compute the freq vector %peak - compute the freq vector
[m n]=size(P1); [m n]=size(P1);
@ -78,3 +78,20 @@ peak_frequency = peak_frequency(location);
heartrate = peak_frequency.*60; heartrate = peak_frequency.*60;
disp(['Heart rate: ', num2str(heartrate), ' bpm']); disp(['Heart rate: ', num2str(heartrate), ' bpm']);
%plotting RGB
figure(2)
subplot(2,2,1);
plot(redChannel,'r');
title('Red Channel');
subplot(2,2,2);
plot(greenChannel,'g');
title('Green Channel');
subplot(2,2,3);
plot(blueChannel,'b');
title('Blue Channel');

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

BIN
heartrate/rgb_plot.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

View File

@ -1,2 +0,0 @@
int main()
return;