You need to enable JavaScript to run this app. 如何在OpenCV中为Keras模型检测到的火焰目标绘制矩形框
优惠活动
大模型
产品
解决方案
定价
更多

如何在OpenCV中为Keras模型检测到的火焰目标绘制矩形框

火焰检测添加目标矩形框解决方案

你当前使用的是图像级分类模型,仅能判断整帧画面是否存在火焰,无法直接输出火焰的坐标位置,要绘制矩形框需要补充火焰定位逻辑,以下是不需要重新训练模型的最小改动方案:

实现思路

  • 保留现有分类逻辑判断当前帧是否存在火焰
  • 当分类结果为存在火焰时,通过HSV颜色空间过滤提取火焰区域(火焰的橙红色特征在HSV空间辨识度极高,计算量小适配实时检测场景)
  • 对提取的火焰掩码做去噪后查找轮廓,计算每个有效轮廓的外接矩形,绘制到原帧上

修改后完整代码

import cv2
import numpy as np
import tensorflow as tf
from PIL import Image
from tensorflow.keras.preprocessing import image

# 加载训练好的分类模型
model = tf.keras.models.load_model('my_model\\InceptionV3.h5')
video = cv2.VideoCapture(0)

# 火焰HSV颜色阈值,可根据实际场景调整
lower_fire = np.array([0, 50, 50])
upper_fire = np.array([35, 255, 255])
# 最小火焰轮廓面积,过滤噪点
min_area = 300

while True:
    ret, frame = video.read()
    if not ret:
        break
    
    # 原有分类逻辑
    im = Image.fromarray(frame, 'RGB')
    im = im.resize((224, 224))
    img_array = image.img_to_array(im)
    img_array = np.expand_dims(img_array, axis=0) / 255
    probabilities = model.predict(img_array, verbose=0)[0]
    prediction = np.argmax(probabilities)
    confidence = probabilities[prediction]
    print(f"检测置信度:{confidence:.2f}")

    # 分类结果为存在火焰时,定位+画框
    if prediction == 0:
        # 转HSV空间做颜色过滤
        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
        mask = cv2.inRange(hsv, lower_fire, upper_fire)
        # 形态学操作去噪
        kernel = np.ones((5,5), np.uint8)
        mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
        mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
        # 查找轮廓
        contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
        
        for cnt in contours:
            area = cv2.contourArea(cnt)
            if area > min_area:
                # 计算外接矩形
                x, y, w, h = cv2.boundingRect(cnt)
                # 画矩形框,颜色为红色,线宽2
                cv2.rectangle(frame, (x,y), (x+w, y+h), (0,0,255), 2)
                # 标注置信度
                cv2.putText(frame, f"Fire {confidence:.2f}", (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,255), 2)
    
    # 显示画面,修正原有重复窗口名的问题
    cv2.imshow("火焰检测", frame)
    if cv2.waitKey(1) & 0xff == ord('q'):
        break

video.release()
cv2.destroyAllWindows()

参数调整说明

  • HSV阈值:如果存在误检/漏检,可以调整lower_fire和upper_fire的数值适配当前场景的光线、火焰颜色
  • 最小轮廓面积:如果画面中噪点较多可以调大min_area,反之需要检测小火焰可以调小

如果需要更高的定位精度,也可以替换为YOLO、SSD等自带目标框输出的检测模型重新训练,不需要额外加颜色过滤逻辑。

内容的提问来源于stack exchange,提问作者fadi12

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 14:15:02