基于计算机视觉的呼吸频率检测方法
创作时间:
作者:
@小白创作中心
基于计算机视觉的呼吸频率检测方法
引用
CSDN
1.
https://blog.csdn.net/weixin_40277125/article/details/143366791
本文介绍了一种基于计算机视觉的呼吸频率检测方法,通过从视频中提取帧并定义ROI区域,计算ROI中的运动幅度,进而检测呼吸频率。文章提供了完整的Python代码实现,包括视频读取、灰度转换、ROI提取、运动幅度计算、数据平滑、峰值检测等关键步骤,并展示了具体的结果图像。
基本流程
- 从视频中提取帧并定义ROI区域
- 计算ROI中的运动幅度
- 基于运动幅度检测呼吸频率
代码实现
import cv2
import numpy as np
from scipy.ndimage import gaussian_filter1d
from scipy.signal import find_peaks
import matplotlib.pyplot as plt
def preprocess_and_detect_motion(video_path, initial_roi=(676, 485, 296, 315)):
cap = cv2.VideoCapture(video_path)
if not cap.isOpened():
raise ValueError("无法打开视频文件,请检查路径是否正确")
fps = cap.get(cv2.CAP_PROP_FPS)
if fps is None or fps <= 0:
raise ValueError("无法获取视频的帧率,请检查视频文件")
ret, frame = cap.read()
if not ret:
raise ValueError("无法读取视频帧,请检查视频文件")
# 初始化 ROI
x_start, y_start, width, height = initial_roi
movements = []
prev_roi_frame = None
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
# 转换为灰度图像并提取 ROI 区域
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
roi_frame = gray[y_start:y_start+height, x_start:x_start+width]
if prev_roi_frame is not None:
# 确保 ROI 大小匹配
if prev_roi_frame.shape == roi_frame.shape:
diff = cv2.absdiff(prev_roi_frame, roi_frame)
movement = np.mean(diff)
movements.append(movement)
prev_roi_frame = roi_frame
cap.release()
return movements, fps
def calculate_breathing_rate(movements, fps):
if len(movements) == 0:
return 0
# 平滑数据
smooth_movements = gaussian_filter1d(movements, sigma=1)
peaks, _ = find_peaks(smooth_movements, distance=fps / 3)
breath_rate = len(peaks) / (len(smooth_movements) / fps / 60)
# 可视化
time_axis = np.arange(len(smooth_movements)) / fps
plt.plot(time_axis, smooth_movements, label='Smoothed Movement')
plt.plot(time_axis[peaks], smooth_movements[peaks], "x", label='Breaths Detected')
plt.title("Breathing Movement over Time")
plt.xlabel("Time (s)")
plt.ylabel("Smoothed Movement Amplitude")
plt.legend()
plt.show()
return breath_rate
def main():
video_path = 'Sow_fast_breathing.mp4'
initial_roi = (676, 485, 296, 315) # 替换为适当的ROI区域(x_start, y_start, width, height)
movements, fps = preprocess_and_detect_motion(video_path, initial_roi)
if movements:
breath_rate = calculate_breathing_rate(movements, fps)
print(f"Estimated Breathing Rate: {breath_rate:.2f} breaths per minute")
else:
print("未检测到任何运动")
if __name__ == "__main__":
main()
参数调整
可以调整sigma
和distance
参数以优化峰值检测效果。例如,将sigma
设置为0.5,将distance
设置为fps/4
可以检测到更多的峰值。
手动选择ROI区域
可以使用以下代码手动选择ROI区域:
import cv2
video_path = 'Sow_fast_breathing.mp4'
cap = cv2.VideoCapture(video_path)
ret, frame = cap.read()
if ret:
roi = cv2.selectROI("Select ROI", frame, fromCenter=False, showCrosshair=True)
cv2.destroyAllWindows()
print("Selected ROI:", roi) # 输出格式为 (x, y, width, height)
cap.release()
结果展示
以下是检测结果的可视化图像:
热门推荐
蓝莓几月开花几月结果,对环境要求高吗?种植方法方法是什么?
购房意向书什么时候签
如何利用技术工具分析板块指数?这种分析工具有哪些实用功能?
如何判断木瓜成熟?从外观到触感的全方位指南
北交所重磅!920第一股来了
下月起强制执行!电动自行车上路有新要求
名中医刘振医生揭秘:湿疹止痒消疹特效方
庭院花园景观设计:回归田园
餐具烫一烫、擦一擦,管用吗?温度和时间是消毒效果的关键
【全民健康生活方式宣传月】健康体重,一起行动!
数字化孕育健康科普新业态
让癌细胞停止生长的办法有了,肿瘤医生:做好3件事,癌症患者
建筑垃圾清运费的收费标准是多少
急性胸痛诊断思路、治疗原则,看最新指南怎么说
天珠的神秘形成过程:自然、文化与人类智慧的奇妙结合
负荆请罪:传统道德观念下的宽容与成长
工商简易注销需要准备什么材料
高级感配色!7个必学的穿搭配色,教你如何轻松摆脱路人感
白发变黑的科学方法:从饮食到生活习惯全方位调理
切尔西的足总杯噩梦:1-2不敌布莱顿,蓝军的问题究竟出在哪里?
巴菲特一直在用的5个关键投资秘诀:价值投资的核心理念与实践
江南园林:山水意象的营造与表达
助听器怎么去验配?如何选择合适功率的助听器?这份选购指南收好
什么是缓冲器?它有什么作用?
设备需求规划怎么写好呢
达人推广计划方案:从资源筛选到效果评估的全方位指南
4个方法,5个最佳的抗衰老动作,让你保持逆龄状态
随着年龄增长,我们的记忆力究竟会发生什么变化?
恐惧是人类从混沌走向秩序的动力——读段义孚《恐惧景观》
淘宝DSR评分详解:含义、计算方式及提升方法