首先数据转换为帧图像
clc;
clear all;
obj = VideoReader('1.mp4');%输入视频位置
numFrames = obj.NumberOfFrames;% 帧的总数
for k = 1:numFrames
frame = read(obj,k);
nz = num2str(k);
id=sprintf(nz,k);
frame=imresize(frame,[227 227]);
imwrite(frame,strcat('帧图像/',id,'.jpg'),'jpg');% 保存帧
end
提取RGB特征
clc;
clear all;
I2=imread('帧图像\10.jpg');
I=double(I2);
R=I(:,:,1);
G=I(:,:,2);
B=I(:,:,3);
% 对于普通的火焰来说,它的红色分量和绿色分量会很大
% 并且绿色分量会大于蓝色分量,所以我们设下的简单判据是:
% R > R_avg AND
% G > G_avg AND
% R > G > B
% 均值
R_avg=mean(R,'all');
G_avg=mean(G,'all');
B_avg=mean(B,'all');
[m,n,p]=size(I);
I1=[];
% 实现图像的RGB检测,把符合RGB判据的素点置为1,否则置为0,返回的是只有0和1的二值化模板。
for i=1:m
for j=1:n
if R(i,j)>R_avg && G(i,j)>G_avg && (R(i,j)>G(i,j))&&(G(i,j)>B(i,j))
I1(i,j)=1;
else
I1(i,j)=0;
end
end
end
figure
imshow(I1)
title('二值化结果')
se1 = strel('disk',2);
f1 = imclose(I1,se1);
[L,num]=bwlabel(f1);
STATS = regionprops(L,'BoundingBox');
%%
figure
imshow(I2)
hold on
rectangle('Position',STATS(1).BoundingBox,'EdgeColor','r','LineWidth',2);
title('基于RGB特征的火焰检测')
达到的效果: