有一段烟雾识别的代码帮忙看看 讲讲其中的原理 1C

tic;
clear all;
close all;
clc;
A = aviinfo('byfwf.avi');
mov = VideoReader('byfwf.avi');
LEN = A.NumFrames;%得到视频的帧数
for i = 1 : LEN
b = read(mov, i);
imwrite(b, strcat('smoke', int2str(i), '.jpg'), 'jpg');
end
for x = 1 : LEN
pic = imread(strcat('smoke', int2str(x), '.jpg'));%读入一张图片
pic1 = pic;%pic1中存放的是处理过后的彩色图像
pic_hsv = rgb2hsv(pic);
s = size(pic1);
bw_pic = zeros(s(1), s(2));
for i = 1 : s(1)
for j = 1 : s(2)
if pic_hsv(i, j, 1) > 0.35 && pic_hsv(i, j, 1) < 0.65 && ...
pic_hsv(i, j, 2) > 0.06 && pic_hsv(i, j, 2) < 0.3 && ...
pic_hsv(i, j, 3) > 0.5 && pic_hsv(i, j, 3) <= 1;
pic1(i, j, 1) = 255;
pic1(i, j, 2 : 3) = 0;
end
if pic1(i, j, 1) == 255 && pic1(i, j, 2) == 0
bw_pic(i, j) = 1;
end
end
end
cov_bw_pic = 1 - bw_pic;
fill_pic = imfill(cov_bw_pic, 'holes');
fill_pic1 = 1 - fill_pic;
B_pic = bwboundaries(fill_pic1);%得到的是一个P×1的单元
ss = size(B_pic);%ss的值就是连通分量的数量
ss1 = size(B_pic{1, 1});%ss1是一个大小为m×2的矩阵
max = ss1(1);
for i = 2 : ss(1)%找到最大的连通区域的边界总个数
ss2 = size(B_pic{i, 1});
if ss2(1)> max
max = ss2(1);
end
end
%⑤…………………………将小于最大连通区域的连通分量边界赋零
for k = 1 : ss(1)%将小于最大连通区域的连通分量边界赋零,
%其作用就是将其余小的连通分量与边界隔开
Mid = B_pic{k, 1};
ss3 = size(Mid);
if ss3(1) < max
for i = 1 : ss3(1)
fill_pic1(Mid(i, 1), Mid(i, 2)) = 0;

end
end
end
%反转填充
cov_fill_pic1 = 1 - fill_pic1;
A_fill_pic = imfill(cov_fill_pic1, 'holes');%进行内部填充,再反变换回来,即得到所要求的区域
A_fill_pic1 = 1 - A_fill_pic;
B_pic1 = bwboundaries(A_fill_pic1);
sss = size(B_pic1);%sss的值就是连通分量的数量
for k = 1 : sss(1)%该循环作用是找到最大区域的边界,然后在原图像的对应位置上赋红
Mid = B_pic1{k};%Mid是一个m×2的矩阵,m就是边界点的数量
%ss4(1)表示边界点的数量,Mid(i, 1)和Mid(i, 2)表示边界点的坐标
ss4 = size(Mid);
if ss4(1) == max
for i = 1 : ss4(1)
pic(Mid(i, 1), Mid(i, 2), 1) = 255;

pic(Mid(i, 1), Mid(i, 2), 2 : 3) = 0;

end
end
end
imwrite(pic, strcat('lou_smoking', int2str(x), '.jpg'), 'jpg');
end
aviobj = avifile('lou_smoking.avi');%将处理后的图片连成视频文件
aviobj.fps = 25;%初始化视频文件的属性
aviobj.Quality = 100;
aviobj.compression = 'None';
for i = 1 : LEN
frame = imread(strcat('lou_smoking', int2str(i), '.jpg'));
aviobj = addframe(aviobj, uint8(frame));
end
aviobj=close(aviobj);%关闭aviobj的对象
toc;

qq_43654065
别打,我是酱油 你好,你那有完整的烟雾识别程序吗?
一年多之前 回复

2个回答

这个其实就是简单的分割出烟雾目标,然后进行区域连通,形成完整的烟雾区域

qq_33040075
qq_33040075 他是不是就是基于烟雾的颜色进行分割的?
大约 4 年之前 回复
qq_33040075
qq_33040075 他是不是就是基于烟雾的颜色进行分割的?
大约 4 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问