Python+OpenCV实现火焰检测与实时预警

Felix
Felix
发布时间:2026-10-11| 2人浏览过
原创

本文详细讲解如何使用 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()

关键配置说明:

  1. 视频源切换:默认 cv2.VideoCapture(0) 调用硬件摄像头。如需读取本地视频,将参数改为具体路径,例如 cv2.VideoCapture('fire2.mp4')。
  2. 检测参数调整:第4行 detectMultiScale(gray, 1.2, 5) 中,1.2 为图像缩放比例,5 为最小邻居数。若误报较多可适当增大后者,漏检则调小前者。
  3. 颜色标识:代码中 cv2.rectangle 第三个参数 (0, 255, 0) 代表 OpenCV BGR 色彩空间下的纯绿色,用于高亮火源区域。

实际运行效果

OpenCV火焰检测实时画面,绿框标识识别到的火源区域
模型成功定位并标注的视频帧输出效果

常见问题排查与注意事项

在部署或运行过程中,若遇到异常请参考以下步骤核对:

  • 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 实现火焰检测与实时预警的详细内容,更多关于基于计算机视觉的安全监控资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。