用 python 编写代码,从绿色通道帧的视频中提取心率

Code in python to extract Heart Rate from video from green channel frame

提问人:daniel 提问时间:11/14/2023 更新时间:11/14/2023 访问量:37

问:

这是我的代码,但心率值不准确。 请帮助我如何改进它。 正常 BPM 应为 60-100。 我试图通过获取绿色通道来提取 hr,然后计算它的 fft 频率, 然后找到峰值并过滤它们,然后计算峰值,然后将其转换为 BPM。 当然,这种方式基于一些文章,现在我想实现它。

import numpy as np
from scipy.signal import find_peaks

class ExtractHeartRate:
   def __init__(self, green_channel, timer):
    self.green_channel = green_channel  # Green channel of the frame
    self.timer = timer
    self.heart_rate = 0

   def calc_hr_process(self):
    # Perform FFT on the Green Channel
    fft_result = np.fft.fft(self.green_channel)
    fft_result = np.abs(fft_result).flatten()
    fft_freq = np.fft.fftfreq(len(fft_result))

    # Locate peaks in the necessary frequency range
    peaks, _ = find_peaks(fft_result, height=0, threshold=0)

    # Filter peaks within the necessary frequency range
    valid_peaks = peaks[(fft_freq[peaks] >= 0.48) & (fft_freq[peaks] <= 4)]

    # Count the peaks within a set time range
    elapsed_time = self.timer.elapsed() / 1000  # Elapsed time in seconds
    if elapsed_time > 0:
        # Calculate the peak count within the set time range
        peak_count = len(valid_peaks)

        # Calculate the heart rate
        heart_rate = peak_count * 60 / elapsed_time  # Convert to BPM using elapsed time
        self.heart_rate = round(heart_rate)
    else:
        self.heart_rate = 0
    return self.heart_rate
Python 视频 信号 FFT 心率

评论

0赞 OM222O 11/14/2023
我看过史蒂夫·莫尔德(Steve Mould)的视频,试图实现类似的事情,但如果你也尝试你的色彩空间(例如,红色-平均(蓝色,绿色)或红-绿色/红-蓝色),你可能会有更好的运气。眼睛中也存在类似的颜色对比滤镜(但不是很清楚,对它们仍有争议):youtube.com/watch?v=mvNRmL5rqQs
0赞 daniel 11/20/2023
只需要通过从额头到脸部的绿色通道来实现它。
0赞 OM222O 11/20/2023
为什么会有这么奇怪的要求?此外,有一个示例输入会很有帮助
0赞 daniel 11/22/2023
因为这个理论是我的项目所基于的。我目前有一个系统可以捕获视频帧,我从中提取绿色通道,所以我有一个输入可以使用。
0赞 OM222O 11/22/2023
介意分享示例视频吗?同样,当我们没有可重现的例子时,基本上不可能知道你在做什么

答: 暂无答案