基于图像的指尖 PPG(iPPG)心率测量算法设计
本项目不接入实时摄像头,使用离线采集的指尖遮挡镜头视频/图像数据完成算法验证与演示(“基于图像”输入不变,仅把采集环节离线化,便于复现与对比测试)。
项目封面

项目说明
基于图像的指尖 PPG(iPPG)心率测量算法设计
本项目不接入实时摄像头,使用离线采集的指尖遮挡镜头视频/图像数据完成算法验证与演示(“基于图像”输入不变,仅把采集环节离线化,便于复现与对比测试)。
目标(全流程)
导入指尖遮挡镜头视频 → 选取 ROI → 提取 iPPG 序列(ROI 内 RGB 统计/通道组合)→ 预处理(去趋势 + 带通 + 标准化)→ 心率估计(频域 PSD 主结果 + 时域峰值对照)→ 评估(有/无真值两套口径)→ 导出结果(CSV/参数 JSON/图表)。
数据与采集建议(默认条件)
- 数据形式:
mp4/avi/mov等常见视频文件(手机拍摄均可) - 拍摄方式:指尖完全覆盖镜头与补光灯(优先“闪光灯常开”),尽量保持稳定
- 帧率:优先 30 fps 或更高;程序会自动读取视频 FPS,读取失败则默认 30 fps
- 注意:若环境光强烈变化/移动明显,会导致 iPPG 质量下降(可通过 ROI 选择更稳、缩短移动、提高光照稳定性改善)
默认实验条件
- 采样率(FPS):视频自带 FPS 优先;失败则 30 fps
- 心率频段:0.7–4 Hz(42–240 bpm)
- 滤波:Butterworth 带通 3 阶 +
filtfilt零相位 - 滑窗:10 s;步长 1 s
- 通道组合(可做对比):
g/g-r/gnorm
功能清单(对应“技术路线”)
- 视频导入:读取离线视频、展示首帧、记录 FPS/时长
- ROI 交互选取:在首帧拖拽矩形 ROI(指尖区域)
- iPPG 提取:逐帧计算 ROI 内 RGB 均值,构造时间序列并做通道组合
- 预处理:去趋势、带通滤波、标准化(输出“原始 vs 预处理后”对比)
- 心率估计:
- 频域法(主结果):Welch PSD,取心率频段内主峰频率 (f*{max}),(HR=60f*{max})
- 时域法(对照):峰值检测得到 RR 间期,(HR=60/\overline{RR})
- 置信度:频域主峰能量占比、时域 RR 稳定性(用于“质量/可信度”展示)
- 评估与分析(两套口径):
- 有真值:对齐 ECG/脉搏氧仪心率,计算 MAE、RMSE、MAPE、相关系数、Bland–Altman
- 无真值(默认口径):PSD 与 Peaks 的一致性(平均绝对差)、心率序列稳定性(标准差)、有效窗占比/置信度分布
- 导出与复现:导出信号与心率 CSV、运行配置 JSON(便于复现与对比测试)
算法实现说明
1) 从图像生成 iPPG 信号
- 对视频逐帧读取图像 (I_t),在 ROI 区域计算 RGB 均值:
- (r[t]=mean(R_{ROI})), (g[t]=mean(G_{ROI})), (b[t]=mean(B_{ROI}))
- 选择通道组合得到原始 iPPG 序列 (x[t]):
g:(x[t]=g[t])g-r:(x[t]=g[t]-r[t])gnorm:(x[t]=g[t]/(r[t]+g[t]+b[t]))
2) 预处理
- 去趋势(线性 detrend)抑制缓慢漂移
- 0.7–4 Hz 带通滤波保留脉搏主频成分
- z-score 标准化增强跨视频/跨光照可比性
3) 心率估计
- 频域法(Welch PSD):在 0.7–4 Hz 内取主峰频率 (f*{max}),输出 (HR=60f*{max})
- 时域法(峰值检测):在带通后信号中检测峰值并约束最小峰距,计算 RR 间期平均得到 HR
- 置信度:
- 频域:(\text{conf}=\frac{P(f*{max})}{\sum*{f \in band} P(f)})
- 时域:RR 变异系数 (CV=\sigma*{RR}/\mu*{RR}),(\text{conf}=1-CV)(截断到 0–1)
项目结构
.
├─ main.py
├─ requirements.txt
├─ README.md
├─ core/
│ ├─ pipeline.py # 端到端流水线:视频→PPG→预处理→心率
│ ├─ ppg_extract.py # ROI 提取、RGB 均值、通道组合
│ ├─ preprocess.py # 去趋势/带通/z-score
│ ├─ hr_estimate.py # PSD 与峰值两类心率估计
│ └─ signal_quality.py # 饱和/亮度/运动等质量特征(用于展示/扩展门控)
└─ ui/
└─ main_window.py # Qt 界面、绘图、导出
如何运行
安装依赖:
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
启动界面:
python main.py
使用步骤
- 点击“打开视频…”
- 在“视频首帧/ROI”页拖拽黄色矩形框到指尖区域
- 点击“确认ROI”
- 点击“运行全流程”
- 在“信号/心率”页查看曲线与对比结果
- 点击“导出结果…”
导出文件说明
导出目录下默认生成:
ppg_signals.csv:t_sec, r, g, b, ppg_raw, ppg_filthr_psd.csv:t_sec, bpm_psd, conf_psdhr_peaks.csv:t_sec, bpm_peaks, conf_peaksrun_config.json:视频路径、FPS、ROI、滤波/窗口/通道组合等参数(用于复现)
评估口径建议
- 若你最终能采到真值(脉搏氧仪或 ECG,同步时间戳):把真值序列导入后,按滑窗对齐计算 MAE/RMSE/MAPE,并给出 Bland–Altman 图与相关系数
- 若只有离线视频:用“PSD vs Peaks 一致性(MAD)+ 稳定性(STD)+ 有效窗占比/置信度分布”作为主要评估指标,并明确属于“无真值一致性评估”
常见问题
- 为什么心率曲线有 NaN/断点?
- 该时间窗内信号太短、峰值不足或 PSD 频段内能量不明显,属于正常现象;可尝试更稳定的 ROI、更强的补光、或增大滑窗长度
- 视频 FPS 读取为 0 怎么办?
- 程序会自动回退到 30 fps;建议换一个编码更标准的视频或转码后再测试
技术分类
包含内容
适用人群
学习参考与二次开发
关于 AI源码
AI源码 专注优质项目源码分享,提供完整源码、详细文档与技术支持,助力源码设计与课程作业。
相关推荐
查看全部 →
城市交通流量预测与拥堵成因分析系统
是一个面向城市交通拥堵分析的 monorepo,覆盖计算机设计课题中的主要能力链路:

电商用户行为漏斗与CRO转化率优化分析
电商用户行为漏斗与CRO转化率优化分析(E-Commerce Funnel CRO)是一套面向电商运营的数据分析平台,覆盖从用户访问到最终购买的完整漏斗链路,提供多维诊断、统计检验、PIE 优先级矩阵与 XGBoost 购买预测等能力,帮助运营团队精准定位转化瓶颈并制定优化策略。

多组学癌症预后预测分析系统
基于 Flask 的 Web 应用,用于上传 TCGA 风格合并表、做特征与标签概览、Cox 预后风险评分与生存相关可视化。模型在本地训练后以 形式加载,不提供旧版演示数据或假模型兜底。

基于 Apriori 算法的中药配伍审查系统
本系统是一个基于经典 Apriori 关联规则挖掘算法的中药配伍审查平台,使用真实中医药处方数据集(PTM-TKDE2018),实现药材频繁项集挖掘、关联规则生成与配伍禁忌审查。

基于 Python 的城市共享单车骑行需求时空分析系统
本系统是一个基于 Python Flask 框架的城市共享单车骑行需求时空分析平台,使用 Oslo City Bike(奥斯陆城市自行车)开放数据,提供系统总览、时间维度分析、空间维度分析、站点运营分析、OD 起讫流动分析、骑行需求预测、综合分析报告等功能模块,适用于城市共享单车运营调度与骑行需求研究场景。

基于 Python 的短视频用户行为分析系统
基于快手 KuaiRec / KuaiRand 数据集的短视频推荐分析平台,提供用户行为分析、推荐偏差检测、内容运营洞察、图神经网络推荐等完整分析链路。