Как я могу получить частоту сердечных сокращений этого видео сигнала?
Я рассчитал БПФ и нашел пики.
file = 'Chel.mp4';
vidObj = VideoReader(file);
display('%%%%%%%%%%%%%%%%%%%%');
disp(file);
display('Carga Video');
vidFrame = vidObj.FrameRate;
vidW = vidObj.Width;
vidH = vidObj.Height;
k = 1;
data = [];
t = [];
while hasFrame(vidObj)
frame = readFrame(vidObj);
t(k) = vidObj.CurrentTime;
d1 = double(squeeze(frame(:,:,1)));
d2 = double(squeeze(frame(:,:,2)));
d3 = double(squeeze(frame(:,:,3)));
data(:,:,k) = d1.^2+d2.^2+d3.^2;
k = k+1;
end
NumFrame = k-1;
display('Proceso Completado !!');
display(['Numero de Cuadros =' num2str(NumFrame)]);
display(['Dimensiones por cuadro ' num2str(vidW) 'x' num2str(vidH)]);
display(['Cuadros por segundo =' num2str(vidFrame)]);
Y = reshape(data,vidW*vidH,NumFrame);
ym = mean(Y,1);
PPG = ym-mean(ym);
figure(1)
plot(t,PPG,'LineWidth',2); grid on; xlabel('Tiempo (seg)'); ylabel('PPG');
%%
devPPG = (fft(PPG));
dev2PPG = abs(devPPG.^2);
figure(2)
plot(dev2PPG)
[PKS,LOCS] = findpeaks(dev2PPG);
plot(t,dev2PPG,'b-',t(LOCS),dev2PPG(LOCS),'ro','LineWidth',2);
grid on;
xlabel('Tiempo (seg)');
ylabel('PPG');
График видео:
График пиков fft:
Я пробовал это, но это вычисляет только частоту сердечных сокращений 60, когда частота сердечных сокращенийобразца видео должно быть примерно 80.
meanCycle = (mean(diff(LOCS))*((max(t-1) - min(t-1))