4月7日

ai烟雾报警系统

import cv2
import numpy as np
from tensorflow.keras.models import load_model
import time
import winsound  # Windows系统报警音,Linux/Mac可使用其他库

# 系统配置
MODEL_PATH = 'smoke_fire_detection.h5'  # 预训练模型路径
ALARM_THRESHOLD = 0.85  # 报警置信度阈值
CHECK_INTERVAL = 0.5    # 检测间隔(秒)

class SmokeFireDetector:
    def __init__(self):
        # 加载预训练模型
        self.model = load_model(MODEL_PATH)
        self.cap = cv2.VideoCapture(0)  # 使用默认摄像头
        self.alarm_status = False
        self.last_alarm = 0

        # 初始化窗口
        cv2.namedWindow('AI Smoke/Fire Detection')

    def preprocess_frame(self, frame):
        """预处理视频帧"""
        frame = cv2.resize(frame, (224, 224))  # 调整尺寸匹配模型输入
        frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        frame = frame / 255.0  # 归一化
        return np.expand_dims(frame, axis=0)

    def analyze_frame(self, frame):
        """使用模型分析帧"""
        preprocessed = self.preprocess_frame(frame)
        prediction = self.model.predict(preprocessed)
        return prediction[0][0]  # 假设输出为[无危险概率, 有危险概率]

    def trigger_alarm(self):
        """触发报警"""
        if not self.alarm_status:
            print("[!] 检测到烟雾/火焰危险!")
            self.alarm_status = True
            winsound.Beep(2000, 1000)  # 1秒报警音

        self.last_alarm = time.time()

    def run(self):
        """主循环"""
        while True:
            ret, frame = self.cap.read()
            if not ret:
                print("无法获取视频流")
                break

            # 定时检测
            if time.time() - self.last_alarm > CHECK_INTERVAL:
                confidence = self.analyze_frame(frame)
                if confidence > ALARM_THRESHOLD:
                    self.trigger_alarm()
                else:
                    self.alarm_status = False

            # 显示界面
            display_frame = cv2.resize(frame, (640, 480))
            if self.alarm_status:
                cv2.putText(display_frame, "ALARM! SMOKE/FIRE DETECTED!", 
                           (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,255), 2)
            
            cv2.imshow('AI Smoke/Fire Detection', display_frame)

            # 退出检测
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break

        self.cap.release()
        cv2.destroyAllWindows()

if __name__ == "__main__":
    detector = SmokeFireDetector()
    detector.run()

 

posted @ 2025-04-09 10:38  KuanDong24  阅读(29)  评论(0)    收藏  举报