Python+OpenCV实现火焰检测与实时预警
本文详细讲解如何使用 Python 配合 OpenCV 的 Haar 级联分类器实现实时火焰检测系统。通过加载预训练 XML 模型识别视频流中的火情,并结合 threading 模块异步触发音频报警与 SMTP 邮件通知。内容涵盖环境配置、核心代码解析、摄像头与文件读取切换方法及常见报错排查,助您快速掌握基于计算机视觉的安全监控基础流程。
项目原理与功能说明
本系统基于 OpenCV 的 Haar 特征级联分类器(CascadeClassifier)对视频帧进行多尺度扫描。模型读取输入帧并转换为灰度图后,自动识别火焰区域。一旦检测到匹配目标,程序会在该位置绘制检测框,并利用 threading 模块启动后台线程同步播放报警音频与发送 SMTP 电子邮件。通过 runOnce 状态变量控制告警触发频率,避免重复发送相同警告。
运行环境准备
在开始运行代码前,请确保本地 Python 环境已安装以下依赖库:
opencv-python:用于图像预处理、模型加载与视频流读取。playsound:用于异步播放音频警报文件。smtplib:Python 标准库,无需额外安装,用于构建邮件客户端。
准备必要的资产文件:
- 预训练的火焰检测模型:
fire_detection_cascade_model.xml(需自行获取或训练)。 - 报警音频文件:
fire_alarm.mp3。 - Gmail 发件人账号与专用密码(App Password)。
核心代码逻辑与配置
以下为完整的火焰检测主脚本。代码依次完成模型实例化、摄像头初始化、告警函数定义以及逐帧检测循环。
import cv2
import threading
import playsound
import smtplib
# 加载训练好的 XML 文件
fire_cascade = cv2.CascadeClassifier('fire_detection_cascade_model.xml')
# 初始化摄像头
vid = cv2.VideoCapture(0) # 使用笔记本内置摄像头,索引为 0
runOnce = False # 创建布尔变量,用于标记邮件是否已发送
# 定义播放警报声音的函数
def play_alarm_sound_function():
playsound.playsound('fire_alarm.mp3', True)
print("Fire alarm end")
# 定义发送邮件的函数
def send_mail_function():
recipientmail = "add recipients mail"
recipientmail = recipientmail.lower()
try:
server = smtplib.SMTP('smtp.gmail.com', 587)
server.ehlo()
server.starttls()
server.login("add senders mail", 'add senders password')
server.sendmail('add senders mail', recipientmail, "Warning: Fire accident has been reported")
print("Alert mail sent successfully to {}".format(recipientmail))
server.close()
except Exception as e:
print(e)
while True:
Alarm_Status = False
ret, frame = vid.read()
if not ret:
print("Failed to grab frame")
break
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
fire = fire_cascade.detectMultiScale(gray, 1.2, 5)
# 增加调试输出
print(f"Detected fire regions: {len(fire)}")
# 绘制火焰矩形框
for (x, y, w, h) in fire:
cv2.rectangle(frame, (x-20, y-20), (x+w+20, y+h+20), (0, 255, 0), 2)
roi_gray = gray[y:y+h, x:x+w]
roi_color = frame[y:y+h, x:x+w]
print("Fire alarm initiated")
threading.Thread(target=play_alarm_sound_function).start()
if not runOnce:
print("Mail send initiated")
threading.Thread(target=send_mail_function).start()
runOnce = True
else:
print("Mail is already sent once")
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放资源
vid.release()
cv2.destroyAllWindows()
关键配置说明:
- 视频源切换:默认
cv2.VideoCapture(0)调用硬件摄像头。如需读取本地视频,将参数改为具体路径,例如cv2.VideoCapture('fire2.mp4')。 - 检测参数调整:第4行
detectMultiScale(gray, 1.2, 5)中,1.2为图像缩放比例,5为最小邻居数。若误报较多可适当增大后者,漏检则调小前者。 - 颜色标识:代码中
cv2.rectangle第三个参数(0, 255, 0)代表 OpenCV BGR 色彩空间下的纯绿色,用于高亮火源区域。
实际运行效果

常见问题排查与注意事项
在部署或运行过程中,若遇到异常请参考以下步骤核对:
- SMTP 连接失败:Gmail 服务端自 2022 年起已全面禁用普通账户密码登录。必须前往 Google 账户安全设置开启两步验证,并生成 16 位“应用专用密码”替换脚本中的
add senders password。 - 音频/邮件未触发或卡死:
play_alarm_sound_function与send_mail_function均挂载于新线程。当前逻辑使用全局runOnce标志位防重发,但在高并发或网络波动时可能产生竞态条件。若需稳定生产,建议引入threading.Lock()保护该变量的读写。 - 窗口无响应或无法退出:确保终端进程未被阻塞。按
q键触发cv2.waitKey(1)条件即可安全跳出循环,随后释放摄像头资源。 - 依赖冲突:
playsound在不同操作系统下行为略有差异。若使用 macOS 或 Linux 报错,可尝试安装平台适配版本或替换为pygame音频模块。
简要总结
该方案以极低资源消耗实现了基于传统计算机视觉的火灾初筛流程。通过级联模型提取特征、线程分离 IO 操作,兼顾了实时性与告警响应速度。实际部署时可结合阈值过滤与边缘计算设备进一步提升稳定性。以上就是 Python 配合 OpenCV 实现火焰检测与实时预警的详细内容,更多关于基于计算机视觉的安全监控资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













