基于MATLAB的火焰烟雾火灾检测系统

资源链接https://gitee.com/chending006/yanwuicon-default.png?t=LA92https://gitee.com/chending006/yanwu

课题介绍

本设计为基于MATLAB的火焰烟雾火灾检测系统。结合火焰是实时动态跳跃的,采用面积增长率,角点和圆形度三个维度相结合的方式判断是否有火焰。该设计测试对象为视频,通过下一帧和上一帧的差异发现是否有火情,并可发出语音报警。本设计带有一个人机交互式GUI界面,界面友好。是个不错的毕设选题。

  1. 算法流程

结合火焰的面积增长率,角点和圆形度三个维度综合判断。并且得出每帧图像火焰部分的该三个参数,实时显示在GUI上。

  1. GUI界面设计

v2-9010a1a91f9aec28aa20ace7c9f7dc9e_b.jpg

v2-493ac293a79a5a45269bf8d6b71231af_b.jpg

四、程序附录

  1. 读取视频
obj = VideoReader(uigetfile('*.mp4','选择视频'));%输入视频位置
setappdata(0,'obj',obj);%设置全局变量
Show_Frames=read(obj,1);%显示第一帧作为封面
axes(handles.axes1);
imshow(Show_Frames);
set(handles.text16,'String','视频待识别...请稍等!');
 
prompt={'输入图片名称序列号位数:'};
    defans={'3'};%默认三位数
    p=inputdlg(prompt,'输入位数',1,defans);
    numzeros=str2num(p{1});
   nz = strcat('%0',num2str(numzeros),'d');
 
numFrames = obj.NumberOfFrames;% 帧的总数
for k = 1 :5% 读取前15帧  numFrames
frame = read(obj,k);%读取第几帧
id=sprintf(nz,k);
imwrite(frame,strcat('帧系列/',id,'.jpeg'),'jpeg');% 保存帧
end

  1. 视频读取分析
obj=getappdata(0,'obj');
%fileName = 'test.mp4';                         %读取视频函数
fileName = obj;                         %读取视频函数
numFrames = obj.NumberOfFrames;                %帧的总数
Framerate=obj.FrameRate; 
Height=obj.Height;   
Height%一个对象的行
Width=obj.Width;  
Width%一个对象的列
a=0.06;
 
a1=str2num(get(handles.edit1,'String'));
s=str2num(get(handles.edit2,'String'));
a2=str2num(get(handles.edit3,'String'));
 
for i=a1:s:a2                
    set(handles.text15, 'String', strcat('#',num2str(i)));
    Process_Frames=read(obj,i);                %读取当前帧
    axes(handles.axes2);
    imshow(Process_Frames);%显示帧图像
    hsv=rgb2hsv(Process_Frames);               %获取当前帧H、S、V分量
 
    h=hsv(:,:,1);axes(handles.axes8);imshow(h);title('H分量图')
    s=hsv(:,:,2);axes(handles.axes9);imshow(s);title('S分量图')
    v=hsv(:,:,3);axes(handles.axes10);imshow(v);title('V分量图')
 
    [row,col]=find((h>23/24 | h<1/24));      %找出当前帧红色背景的像素坐标
    I_bw=zeros(Height,Width);
    leg=length(row);
    for j=1:leg
        I_bw(row(j),col(j))=1; 
    end
    I_bw=bwareaopen(I_bw,60);                   %去除杂质、删除小面积对象
    axes(handles.axes11);
    imshow(I_bw);
    title('去除杂质小面积对象');
 
    [row,col]=find(Process_Frames(:,:,1)>235 ); %获取当前帧R矩阵
    I_r_bw=zeros(Height,Width);
    leg=length(row);
    for j=1:leg
        I_r_bw(row(j),col(j))=1; 
    end
    I_r_bw=bwareaopen(I_r_bw,50);
 
    [row,col]=find(I_bw);                        %获取当前帧最终火焰图像
    leg=length(row);
    for j=1:leg
        I_r_bw(row(j),col(j))=1; 
    end
    K=imfill(I_r_bw,'holes');
    A=nowA(K);
 
    if leg~=0                       %判断是否有红色分量,有继续执行,无识别下一张图
        Process_Frames0=read(obj,i-3);                %读取上一帧
        hsv0=rgb2hsv(Process_Frames0);                %获取上一帧H、S、V分量
        h0=hsv0(:,:,1);
        s0=hsv0(:,:,2);
        v0=hsv0(:,:,3);
        [row,col]=find((h0>23/24 | h0<1/24)  );
        I_bw0=zeros(Height,Width);
        leg0=length(row);
        for j=1:leg0
            I_bw0(row(j),col(j))=1; 
        end
        I_bw0=bwareaopen(I_bw0,60);
 
        [row,col]=find(Process_Frames0(:,:,1)>235 );
        I_r_bw0=zeros(Height,Width);
        leg0=length(row);
        for j=1:leg0
            I_r_bw0(row(j),col(j))=1; 
        end
        I_r_bw0=bwareaopen(I_r_bw0,50);
        [row,col]=find(I_bw0);
        leg0=length(row);
        for j=1:leg0
            I_r_bw0(row(j),col(j))=1; 
        end
 
        if leg0~=0             %判断上一帧是否有红色分量
            K0=imfill(I_r_bw0,'holes');
            A0=beforeA(K0);
        else
            A0=0;
        end
 
        itedge=edge(K,'canny');  
 
 
 
        C=yuanxingdu(itedge,K,A)   %计算圆形度
        J=abs(A-A0)/A0             %计算火焰面积增长性        
        cnt=Harrris(itedge,a)      %计算角点数
        set(handles.text11, 'String', C);
        set(handles.text12, 'String', J);
        set(handles.text13, 'String', cnt);
 
%         % 显示 
         if (J>0 & C<1)
             set(handles.text16, 'String', '请注意:有火灾');
         end
 
     else
         set(handles.text16, 'String', '无有火灾');
           end
end
set(handles.text16, 'String', '识别完毕!');

  1. 图片分析
[filename,pathname] = uigetfile({'*.jpeg;*.bmp;*.tif;*.png;*.gif','All Image Files'},'请选择一张图片');
if filename == 0%如果没有选择,直接返回即可
    return;
end
strfullname = strcat(pathname,filename);%取得图像文件全名 
I = imread(strfullname);%读取图片
axes(handles.axes2)
imshow(I);%显示图片
title('测试图像')
 
 
 
    set(handles.text15, 'String', '识别单图');
    Process_Frames=I;                %读取当前帧
    hsv=rgb2hsv(Process_Frames);               %获取当前帧H、S、V分量
 
    h=hsv(:,:,1);axes(handles.axes8);imshow(h);title('H分量图')
    s=hsv(:,:,2);axes(handles.axes9);imshow(s);title('S分量图')
    v=hsv(:,:,3);axes(handles.axes10);imshow(v);title('V分量图')
 
    [row,col]=find((h>23/24 | h<1/24));      %找出当前帧红色背景的像素坐标
 
 
    Height=1080;                             %一个对象的行
    Width=1920;                               %一个对象的列
    I_bw=zeros(Height,Width);
    leg=length(row);
    for j=1:leg
        I_bw(row(j),col(j))=1; 
    end
    I_bw=bwareaopen(I_bw,60);                   %去除杂质、删除小面积对象
    axes(handles.axes11);
    imshow(I_bw);
    title('去除杂质小面积对象');
 
    [row,col]=find(Process_Frames(:,:,1)>235 ); %获取当前帧R矩阵
    I_r_bw=zeros(Height,Width);
    leg=length(row);
    for j=1:leg
        I_r_bw(row(j),col(j))=1; 
    end
    I_r_bw=bwareaopen(I_r_bw,50);
 
    [row,col]=find(I_bw);                        %获取当前帧最终火焰图像
    leg=length(row);
    for j=1:leg
        I_r_bw(row(j),col(j))=1; 
    end
    K=imfill(I_r_bw,'holes');
    A=nowA(K);
 
    if leg~=0                       %判断是否有红色分量,有继续执行,无识别下一张图
        %Process_Frames0=read(obj,i-3);                %读取上一帧
        Process_Frames0=imread('帧系列/003.jpeg'); 
        hsv0=rgb2hsv(Process_Frames0);                %获取上一帧H、S、V分量
        h0=hsv0(:,:,1);
        s0=hsv0(:,:,2);
        v0=hsv0(:,:,3);
        [row,col]=find((h0>23/24 | h0<1/24)  );
        I_bw0=zeros(Height,Width);
        leg0=length(row);
        for j=1:leg0
            I_bw0(row(j),col(j))=1; 
        end
        I_bw0=bwareaopen(I_bw0,60);
 
        [row,col]=find(Process_Frames0(:,:,1)>235 );
        I_r_bw0=zeros(Height,Width);
        leg0=length(row);
        for j=1:leg0
            I_r_bw0(row(j),col(j))=1; 
        end
        I_r_bw0=bwareaopen(I_r_bw0,50);
        [row,col]=find(I_bw0);
        leg0=length(row);
        for j=1:leg0
            I_r_bw0(row(j),col(j))=1; 
        end
 
        if leg0~=0             %判断上一帧是否有红色分量
            K0=imfill(I_r_bw0,'holes');
            A0=beforeA(K0);
        else
            A0=0;
        end
 
        itedge=edge(K,'canny');  
 
       a=0.06
 
        C=yuanxingdu(itedge,K,A)   %计算圆形度
        J=abs(A-A0)/A0             %计算火焰面积增长性        
        cnt=Harrris(itedge,a)      %计算角点数
        set(handles.text11, 'String', C);
        set(handles.text12, 'String', J);
        set(handles.text13, 'String', cnt);
 
%         % 显示 
         if (J>0 & C<1)
             set(handles.text16, 'String', '请注意:有火灾');
         end
 
     else
         set(handles.text16, 'String', '无有火灾');
           end

  • 11
    点赞
  • 89
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你的matlab大师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值