使用OpenCV的心率监测器

时间:2015-12-29 17:53:28

标签: python opencv image-processing

我正在尝试构建心率监测器,用户可以将手指放在相机上并打开闪光灯并显示心率。

截至目前,我正在通过手机拍摄视频,然后在笔记本电脑中使用OpenCV进行处理。

我遵循的步骤是:

  • 捕捉视频
  • 找到每个帧的平均红色平面值
  • 过滤数据,以便删除不需要的峰值
  • 计算峰值,然后显示心率

    import numpy as np
    import cv2
    
    #connecting with the captured video file taken from mobile
    cap = cv2.VideoCapture('heart_rate.mp4')
    
    #getting the number of frames 
    no_of_frames = int(cap.get(7))
    
    #assigning an initial zero red value for every frame
    red_plane = np.zeros(no_of_frames)
    
    #time_list is used for storing occurence time of each frame in the video  
    time_list=[]
    t=0
    
    #camera frame per second is 30 and so each frame acccurs after 1/30th second
    difference = 1/30
    for i in range(no_of_frames):
    
        #reading the frame
        ret,frame = cap.read()
        length,width,channels = frame.shape
    
        #calculating average red value in the frame
        red_plane[i] = np.sum(frame[:,:,2])/(length*width)
        time_list.append(t)
        t = t+ difference
    
    
    cap.release()
    

我无法应用低通滤波器来平滑数据,也无法使用OpenCV找到峰值。 任何帮助都会很棒。

1 个答案:

答案 0 :(得分:0)

我以30FPS制作视频,对每个帧r通道求和并将平均和存储到列表中。然后我在matplotlib中绘制列表如下。

enter image description here

我们可以轻松找到从90到第300帧的八个峰值。换句话说,有7 periods in 200 frames( taken in 200/30 s),因此心率为7 / (200/30) = 21/20 => 63/60。这就是说,我的心率是63

也许,Fourier Analysis会有所帮助。但是,不幸的是,我仍然不知道如何在程序中分析这条曲线......

(因为我忘记了Signals & System的{​​{1}})

ORZ ......

心脏跳动手指gif。

enter image description here