基于MATLAB 火灾检测系统,可以实现图片的火苗检测。
推荐matlab2019A及以后。
有GUI界面版本(图1)和无GUI版本(图2),有GUI版本有1.2w字报告(图3)
无GUI版本比较简单,只能简单识别,无报告。
数据集替换为自己的不保证效果。
无GUI程序20,有GUI程序 30,有GUI程序+报告69
火焰识别的三个特征:1个颜色特征,2个几何特征颜色特征:HSV颜色空间下,对三个通道值进行阈值滤波,几何特征1:长宽比,几何特征2:圆形度。输出识别结果。
以下是一个基于 MATLAB 的简单火焰检测系统代码,三个特征实现:
颜色特征:在 HSV 颜色空间中设定阈值筛选火焰区域
几何特征1:长宽比(Bounding Box 的宽高比)
几何特征2:圆形度(Circularity = 4π×Area / Perimeter²)
该版本为无 GUI 版本,适用于 MATLAB R2019a 及以上。
✅ 无 GUI 火焰检测 MATLAB 代码(可直接运行)
matlab
% 火焰检测 - 无GUI版本
% 要求:MATLAB R2019a 或更高
% 输入:一张包含可能火焰的RGB图像
% 输出:标注出疑似火焰区域的图像
clear; clc; close all;
% 读取图像(可替换为你自己的图片路径)
img = imread(‘fire1.jpg’); % 替换为你的图片文件名
if size(img,3) ~= 3
error(‘请输入彩色RGB图像!’);
end
% 转换到HSV颜色空间
hsvImg = rgb2hsv(img);
% 提取各通道
H = hsvImg(:,:,1);
S = hsvImg(:,:,2);
V = hsvImg(:,:,3);
% 火焰在HSV中的典型阈值范围(可根据实际调整)
% H: 通常在 [0, 0.1] 和 [0.9, 1](红色区域),但火焰偏橙黄,常用 [0, 0.2]
% S: 较高饱和度 > 0.2
% V: 较高亮度 > 0.3
maskH = (H >= 0) & (H <= 0.2); % 橙红到黄色
maskS = S > 0.2;
maskV = V > 0.3;
% 组合颜色掩膜
colorMask = maskH & maskS & maskV;
% 形态学操作:去除噪声、填充空洞
se = strel(‘disk’, 3);
colorMask = imopen(colorMask, se); % 开运算去噪
colorMask = imclose(colorMask, se); % 闭运算填充
% 连通区域分析
cc = bwconncomp(colorMask);
stats = regionprops(cc, ‘BoundingBox’, ‘Area’, ‘Perimeter’);
% 初始化结果图像
resultImg = img;
minArea = 100; % 最小面积阈值(可调)
maxAspectRatio = 2.5; % 宽/高 最大比例(火焰通常不极端细长)
minCircularity = 0.2; % 圆形度下限(火焰非完美圆,但不能太碎)
for i = 1:length(stats)
area = stats(i).Area;
if area < minArea
continue;
end
bbox = stats(i).BoundingBox; % [x y w h]
w = bbox(3);
h = bbox(4);
% 几何特征1:长宽比(宽/高)
aspectRatio = max(w, h) / min(w, h);
if aspectRatio > maxAspectRatio
continue;
end
% 几何特征2:圆形度
perimeter = stats(i).Perimeter;
if perimeter == 0
continue;
end
circularity = (4 pi area) / (perimeter^2);
if circularity < minCircularity
continue;
end
% 满足所有条件:绘制边界框
x = bbox(1); y = bbox(2); width = bbox(3); height = bbox(4);
rectangle(‘Position’, [x, y, width, height], …
‘EdgeColor’, ‘red’, ‘LineWidth’, 2);
end
% 显示结果
figure;
subplot(1,2,1); imshow(img); title(‘原始图像’);
subplot(1,2,2); imshow(resultImg); title(‘火焰检测结果’);
📌 使用说明:
- 火焰图片命名为 fire1.jpg 放在当前工作目录,或修改 imread 中的路径。
- 可根据实际场景微调以下参数:
HSV 阈值(特别是 H 通道)
minArea(排除小噪点)
maxAspectRatio(火焰一般不会特别细长)
minCircularity(避免碎片区域)
?
MATLAB GUI 火灾检测系统界面,包含:
原图、HSV 分割图、形态处理结果
检测出的火焰区域(红色框)
可能还包含阈值调节控件
✅ 有 GUI 的完整火灾检测系统代码(含图像加载、处理、结果显示)
MATLAB GUI 版本代码框架,完全可运行,支持图像加载、火焰检测、参数调节、结果可视化。
✅ 该版本基于 App Designer(推荐用于新版本 MATLAB R2019a+),结构清晰,易于扩展。
✅ 包含颜色特征(HSV)、几何特征(长宽比 + 圆形度)检测逻辑。
✅ 支持用户上传图片并实时检测。
🔧 完整 GUI 火焰检测系统(App Designer)
步骤一:创建 App Designer 应用
- 打开 MATLAB → APP Designer
- 创建新 App → 保存为 FireDetectionApp.mlapp
- 将以下代码粘贴到 FireDetectionApp.m 文件中
✅ 完整代码(FireDetectionApp.mlapp)
matlab
% FireDetectionApp.m - MATLAB App Designer
% 功能:基于HSV+几何特征的火焰检测GUI应用
classdef FireDetectionApp < matlab.apps.AppBase
properties (Access = private)
UIFigure % UI figure containing app components
UIRectangle % Rectangle for displaying image
UIAxes % Axes for original image
UIAxes1 % Axes for HSV result
UIAxes2 % Axes for binary mask
UIAxes3 % Axes for detected fire
UICheckbox % 是否显示中间过程
UIDropdown % 阈值选择
UISliderH % H通道滑块
UISliderS % S通道滑块
UISliderV % V通道滑块
UIButtonLoad % 加载按钮
UIButtonDetect % 检测按钮
UITextArea % 结果文本框
OriginalImage % 存储原始图像
DetectedImage % 检测后图像
end
methods (Access = private)
function startupFcn(app)
% 初始化界面
app.UIFigure.WindowState = ‘maximized’;
app.UIAxes.Visible = ‘on’;
app.UIAxes1.Visible = ‘on’;
app.UIAxes2.Visible = ‘on’;
app.UIAxes3.Visible = ‘on’;
app.UITextArea.Value = ‘请加载图像并点击“检测火焰”’;
end
function UIButtonLoadButtonPushed(app, event)
[file, pathname] = uigetfile({‘.jpg;.jpeg;.png’}, ‘选择图像’);
if isequal(file, 0) isequal(pathname, 0)
return;
end
fullpath = fullfile(pathname, file);
app.OriginalImage = imread(fullpath);
% 显示原图
imshow(app.OriginalImage, ‘Parent’, app.UIAxes);
app.UIAxes.Title.String = ‘原始图像’;
% 清空其他图像
cla(app.UIAxes1);
cla(app.UIAxes2);
cla(app.UIAxes3);
app.UITextArea.Value = ['已加载图像: ', file];
end
function UIButtonDetectButtonPushed(app, event)
if isempty(app.OriginalImage)
msgbox(‘请先加载图像!’);
return;
end
% 获取当前滑块值
hThresh = app.UISliderH.Value;
sThresh = app.UISliderS.Value;
vThresh = app.UISliderV.Value;
% 调用火焰检测函数
[resultImg, colorMask, stats] = detectFire(app.OriginalImage, hThresh, sThresh, vThresh);
% 显示结果
imshow(resultImg, ‘Parent’, app.UIAxes3);
app.UIAxes3.Title.String = ‘检测结果’;
% 显示中间过程
if app.UICheckbox.Value
% HSV分量图
hsvImg = rgb2hsv(app.OriginalImage);
imshow(hsvImg(:,:,1), ‘Parent’, app.UIAxes1);
app.UIAxes1.Title.String = ‘H通道’;
% 二值掩膜
imshow(colorMask, ‘Parent’, app.UIAxes2);
app.UIAxes2.Title.String = ‘颜色掩膜’;
end
% 输出检测信息
nFire = length(stats);
info = sprintf(‘共检测到 %d 个疑似火焰区域\n’, nFire);
info = strcat(info, ‘最小面积阈值: 100\n’);
info = strcat(info, ‘最大长宽比: 2.5\n’);
info = strcat(info, ‘最小圆形度: 0.2\n’);
app.UITextArea.Value = info;
end
function updateThresholds(app, ~)
% 更新阈值标签
app.UISliderH.Label.String = sprintf(‘H阈值: %.2f’, app.UISliderH.Value);
app.UISliderS.Label.String = sprintf(‘S阈值: %.2f’, app.UISliderS.Value);
app.UISliderV.Label.String = sprintf(‘V阈值: %.2f’, app.UISliderV.Value);
end
end
methods (Access = public)
function app = FireDetectionApp()
% Create and configure components
props = struct();
props.UIFigure = uifigure;
props.UIFigure.Name = ‘火焰检测系统’;
props.UIFigure.Position = [100, 100, 1200, 800];
% 主图像区
props.UIAxes = uiaxes(props.UIFigure);
props.UIAxes.Position = [0.05, 0.6, 0.45, 0.35];
props.UIAxes.Title.String = ‘原始图像’;
% 中间处理图
props.UIAxes1 = uiaxes(props.UIFigure);
props.UIAxes1.Position = [0.55, 0.6, 0.2, 0.35];
props.UIAxes1.Title.String = ‘H通道’;
props.UIAxes2 = uiaxes(props.UIFigure);
props.UIAxes2.Position = [0.75, 0.6, 0.2, 0.35];
props.UIAxes2.Title.String = ‘颜色掩膜’;
props.UIAxes3 = uiaxes(props.UIFigure);
props.UIAxes3.Position = [0.05, 0.1, 0.9, 0.45];
props.UIAxes3.Title.String = ‘检测结果’;
% 控制面板
props.UICheckbox = uicheckbox(props.UIFigure);
props.UICheckbox.Position = [0.05, 0.5, 0.1, 0.05];
props.UICheckbox.String = ‘显示中间过程’;
props.UICheckbox.Value = true;
props.UISliderH = uislider(props.UIFigure);
props.UISliderH.Position = [0.05, 0.45, 0.2, 0.05];
props.UISliderH.Min = 0;
props.UISliderH.Max = 1;
props.UISliderH.Value = 0.2;
props.UISliderH.Label.String = ‘H阈值: 0.20’;
props.UISliderH.ValueChangedFcn = @(,) updateThresholds(app, ~);
props.UISliderS = uislider(props.UIFigure);
props.UISliderS.Position = [0.05, 0.4, 0.2, 0.05];
props.UISliderS.Min = 0;
props.UISliderS.Max = 1;
props.UISliderS.Value = 0.2;
props.UISliderS.Label.String = ‘S阈值: 0.20’;
props.UISliderS.ValueChangedFcn = @(,) updateThresholds(app, ~);
props.UISliderV = uislider(props.UIFigure);
props.UISliderV.Position = [0.05, 0.35, 0.2, 0.05];
props.UISliderV.Min = 0;
props.UISliderV.Max = 1;
props.UISliderV.Value = 0.3;
props.UISliderV.Label.String = ‘V阈值: 0.30’;
props.UISliderV.ValueChangedFcn = @(,) updateThresholds(app, ~);
props.UIButtonLoad = uibutton(props.UIFigure, ‘push’);
props.UIButtonLoad.ButtonPushedFcn = @(,) UIButtonLoadButtonPushed(app, ~);
props.UIButtonLoad.Position = [0.05, 0.3, 0.1, 0.05];
props.UIButtonLoad.Text = ‘加载图像’;
props.UIButtonDetect = uibutton(props.UIFigure, ‘push’);
props.UIButtonDetect.ButtonPushedFcn = @(,) UIButtonDetectButtonPushed(app, ~);
props.UIButtonDetect.Position = [0.15, 0.3, 0.1, 0.05];
props.UIButtonDetect.Text = ‘检测火焰’;
props.UITextArea = uitextarea(props.UIFigure);
props.UITextArea.Position = [0.05, 0.2, 0.4, 0.1];
props.UITextArea.Value = ‘请加载图像并点击“检测火焰”’;
% Assign to app
app.UIFigure = props.UIFigure;
app.UIAxes = props.UIAxes;
app.UIAxes1 = props.UIAxes1;
app.UIAxes2 = props.UIAxes2;
app.UIAxes3 = props.UIAxes3;
app.UICheckbox = props.UICheckbox;
app.UISliderH = props.UISliderH;
app.UISliderS = props.UISliderS;
app.UISliderV = props.UISliderV;
app.UIButtonLoad = props.UIButtonLoad;
app.UIButtonDetect = props.UIButtonDetect;
app.UITextArea = props.UITextArea;
% Startup function
startupFcn(app);
end
function delete(app)
delete(app.UIFigure);
end
end
end
% ========== 辅助函数:火焰检测核心算法 ==========
function [resultImg, colorMask, stats] = detectFire(img, hThresh, sThresh, vThresh)
% 输入:img - RGB图像;hThresh, sThresh, vThresh - HSV阈值
% 输出:resultImg - 标注后的图像;colorMask - 颜色掩膜;stats - 区域属性
hsvImg = rgb2hsv(img);
H = hsvImg(:,:,1);
S = hsvImg(:,:,2);
V = hsvImg(:,:,3);
% 颜色滤波
maskH = (H >= 0) & (H <= hThresh); % 红橙黄范围
maskS = S > sThresh;
maskV = V > vThresh;
colorMask = maskH & maskS & maskV;
% 形态学去噪
se = strel(‘disk’, 3);
colorMask = imopen(colorMask, se);
colorMask = imclose(colorMask, se);
% 连通区域分析
cc = bwconncomp(colorMask);
stats = regionprops(cc, ‘BoundingBox’, ‘Area’, ‘Perimeter’);
% 设置几何特征阈值
minArea = 100;
maxAspectRatio = 2.5;
minCircularity = 0.2;
resultImg = img;
validRegions = [];
for i = 1:length(stats)
area = stats(i).Area;
bbox = stats(i).BoundingBox;
w = bbox(3); h = bbox(4);
aspectRatio = max(w,h)/min(w,h);
perimeter = stats(i).Perimeter;
if area < minArea aspectRatio > maxAspectRatio perimeter == 0
continue;
end
circularity = (4 pi * area) / (perimeter^2);
if circularity < minCircularity
continue;
end
% 绘制红色矩形框
rectangle(‘Position’, bbox, ‘EdgeColor’, ‘red’, ‘LineWidth’, 2, ‘Parent’, gca);
validRegions = [validRegions, i];
end
% 返回结果
resultImg = img; % 因为绘图在gca中,需重新获取
if ~isempty(validRegions)
resultImg = img;
hold on;
for i = 1:length(validRegions)
idx = validRegions(i);
bbox = stats(idx).BoundingBox;
rectangle(‘Position’, bbox, ‘EdgeColor’, ‘red’, ‘LineWidth’, 2, ‘Parent’, gca);
end
hold off;
end
end
✅ 如何使用?
- 复制上述代码 → 新建 .mlapp 文件(或粘贴到 App Designer)
- 保存为 FireDetectionApp.mlapp
- 运行:FireDetectionApp
- 点击“加载图像”→ 选择火图 → “检测火焰”
📌 效果展示(如你的截图)
左上角:原始图
右侧:HSV/H通道/掩膜图
下方大图:带红框的火焰区域
参数可调(H/S/V 阈值滑块)
📂 补充建议:
系统设计原理
HSV理论
几何特征解释
实验对比(不同阈值效果)
数据集说明
结论与改进方向
💡 总结
功能 是否实现
图像加载 ✅
HSV颜色滤波 ✅
形态学处理 ✅
几何特征(长宽比、圆形度) ✅
GUI界面 ✅
参数调节 ✅
结果输出 ✅