基于图像的指尖 PPG(iPPG)心率测量算法设计
离线指尖遮挡镜头视频的 iPPG 心率测量算法:ROI 选取、RGB 通道组合、带通滤波、Welch PSD 频域与时域峰值对照,Qt 界面可视化并导出 CSV,适合生物医学信号处理毕业设计。
项目封面

项目概览
全流程覆盖视频导入、首帧 ROI 交互框选、逐帧 RGB 均值构造 PPG 序列(g/g-r/gnorm)、去趋势 Butterworth 带通、10s 滑窗心率估计与置信度评估;支持有真值 MAE/RMSE/Bland-Altman 与无真值 PSD-Peaks 一致性双口径。PyQt 界面可导出 ppg_signals.csv、hr_psd.csv 与 run_config.json,适合数字图像处理、生理信号算法类 Python 毕业设计。
项目说明
基于图像的指尖 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;建议换一个编码更标准的视频或转码后再测试
获取完整源码
技术分类
包含内容
适合方向
适合生物医学工程、电子信息、计算机毕业设计中 iPPG 算法、OpenCV 视频处理与 Qt 可视化方向;不依赖实时摄像头,便于离线复现实验。
关于 AI源码
AI源码 整理计算机毕业设计、课程设计向的可运行项目参考,含说明文档与演示材料。完整源码请通过联系方式沟通获取。
相关推荐
查看全部 →
社区医疗服务可视化系统
Spring Boot+Vue2 社区医疗服务可视化管理系统,面向社区医疗机构,含患者管理、预约挂号、病历药品管理与 ECharts 数据统计,集成 Shiro 权限与百度 AI 辅助,适合 Java 医疗信息化毕业设计。

大学生在线焦虑测试系统
专为大学生设计的在线心理健康评估平台,Spring Boot 3+Vue3 实现焦虑测评、在线咨询与个性化建议,支持学生、医生、管理员三角色,含 JWT 认证与 ECharts 结果分析,适合 Java 心理健康类毕业设计。

社区医院儿童健康信息管理系统
Spring Boot 3+Vue 3 社区医院儿童健康信息管理系统,支持儿童档案、健康测评、疫苗预约与在线咨询,JWT 认证含管理员、医生与普通用户三角色,适合 Java 医疗健康类毕业设计。

AI在线问诊平台
基于若依框架的 AI 在线问诊平台,管理端、医生端与患者端三端分离,支持 WebSocket 即时聊天、AI 辅助诊断与 ECharts 数据可视化,Spring Boot+Vue2 技术栈,适合 Java 医疗 AI 毕业设计。

社区医院儿童健康信息管理系统(java)
Spring Boot 3+Vue3 社区医院儿童健康档案管理平台,含儿童档案录入、健康数据统计、就诊记录、疫苗接种与成长曲线追踪,JWT 认证与医生工作台,适合 Java 社区医疗类毕业设计。

心理健康教育小程序
微信小程序原生开发的心理健康教育与自助服务系统,涵盖情绪管理、压力应对、正念冥想、心理测评与自助工具箱等模块,纯前端 Mock 数据实现,适合心理健康主题毕业设计。