当前位置: 首页>编程语言>正文

python 火焰识别算法 开源 yolo 火焰识别 matlab火焰检测源码

一、课题介绍

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

二、算法流程

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

三、GUI界面设计

python 火焰识别算法 开源 yolo 火焰识别 matlab火焰检测源码,python 火焰识别算法 开源 yolo 火焰识别 matlab火焰检测源码_界面设计,第1张

四、程序附录
1、读取视频

obj = VideoReader(uigetfile(‘*.mp4’,‘选择视频’));%维心: matlab2022
 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

2、视频读取分析

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’, ‘识别完毕!’);

3、图片分析

[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

python 火焰识别算法 开源 yolo 火焰识别 matlab火焰检测源码,python 火焰识别算法 开源 yolo 火焰识别 matlab火焰检测源码_matlab_02,第2张



https://www.xamrdz.com/lan/58u1963238.html

相关文章: