qq_33040075 2016-05-14 12:21 采纳率: 0%
浏览 3388
已结题

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

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;

  • 写回答

2条回答 默认 最新

  • devmiao 2016-05-14 23:55
    关注
    评论

报告相同问题?

悬赏问题

  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容