matlab2013b
第一步:读取图片视屏序列
function [n_frames,I3] = func_readvedio(folder,list);
n_frames = 0;
for i=1:length(list)
I = imread(fullfile(folder,list(i).name));
I2 = rgb2gray(uint8(I));
I3(:,:,i) = I2;
n_frames = n_frames + 1;
end
这样写可以专门用来读取连续编号的图片序列作为视屏。
第二步:提取背景
这个部分的方法参考您提供的论文的这个部分:
对应的代码如下所示:
function back3 = func_getbackground(image,frames,T);
rows = size(image,1);
cols = size(image,2);
d(1:rows,1:cols,1) = image(1:rows,1:cols,1);
for k = 2:frames
d(1:rows,1:cols,k) = image(1:rows,1:cols,k) - image(1:rows,1:cols,k-1);
end
//以上就是求解图像的差分
CDM(1:rows,1:cols,2:frames) = d(1:rows,1:cols,2:frames);
CDM(abs(CDM) < T)=0;
CDM(abs(CDM) >= T)=255;
//求CDM值
m=0;
for i=1:rows
for j=1:cols
for k=2:frames
if CDM(i,j,k) == 0
m(k)=1;
end
if CDM(i,j,k) == 255
m(k)=rand(1);
end
end
position(i,j) = func_position(m);
end
end
//求解CDM中最大的连0的坐标
for i=1:rows
for j=1:cols
back3(i,j) =image(i,j,position(i,j));
end
end
//获得背景
第三步:当前图片与背景的差
function images2 = func_subbackground(image,back,frames,T2);
rows = size(image,1);
cols = size(image,2);
for k=1:frames
images(1:rows,1:cols,k) = back(1:rows,1:cols)-image(1:rows,1:cols,k);
images2(1:rows,1:cols,k) = im2bw(images(1:rows,1:cols,k),T2);
end
这里求解差,并将得到的结果求二值图
第四步:形态学处理
rows = size(image,1);
cols = size(image,2);
for k=1:frames
images3(1:rows,1:cols,k)=bwareaopen(image(1:rows,1:cols,k),10);
end
这里我们主要将视屏中的个别噪点去掉使画面更加’干净’;
第五步:边缘检测
function images = func_edgecheck(image,frames);
rows = size(image,1);
cols = size(image,2);
for k = 1:frames
for i=2:rows
for j=2:cols
if image(i,j,k)==1 &&(image(i+1,j,k)==0||image(i-1,j,k)==0||image(i,j+1,k)==0||image(i,j-1,k)==0)
images(i,j,k)=255;
else
images(i,j,k)=0;
end
end
end
end
普通边间求解法
第六步:求解前景像素数
function Num = func_pixel(image,frames);
rows = size(image,1);
cols = size(image,2);
Num(1:frames) = 0;
for k = 1:frames
for i=2:rows
for j=2:cols
if image(i,j,k)>0
Num(k) = Num(k)+1;
end
end
end
end
plot(Num,'r-*');
grid;
ylabel('ÏñËØÊý');
xlabel('Ö¡ÊýÄ¿');
title('µÍÃܶÈÈË¿ÚÃܶÈ');
第七步:拟合说明
这个步骤主要是通过求的的像素值与实际存在的人数进行拟合。其拟合效果如下所示:
通过拟合得到人数和像素数的关系曲线为:
即在低密度的条件下,像素数和人数的关系曲线。
clc;clear;close all;Max_num = 8;%本视屏的最大人数数目folder = 'Vedio\01\';list = dir('Vedio\01\*.jpg');level = 60;level2 = 0.25;%step1:读取图片序列[n_frames,I3] = func_readvedio(folder,list);implay(I3);%step2:提取背景back3 = func_getbackground(I3,n_frames,level);figure;imshow(uint8(back3));%step3:背景差images2 = func_subbackground(I3,back3,n_frames,level2);implay(images2);%step4:形态学处理images3 = func_Xintai(images2,n_frames);implay(images3); %step5:边缘检测images4 = func_edgecheck(images3,n_frames);implay(images4);%step6:统计前景像素数目Num1 = func_pixel(images3,n_frames);%曲线拟合xdata1=1:length(Num1);a1=polyfit(xdata1,Num1,1);y1=polyval(a1,xdata1);figure;plot(y1,'b-*');hold on;plot(Num1,'r-*');a1%人数曲线拟合figure;x1=1:Max_num;y1=5*a1(1)*x1+a1(2);plot(y1,x1,'r-*');title('前景人数');grid on;%step6:统计前景边缘像素数目Num2 = func_pixel(images4,n_frames);%曲线拟合xdata2=1:length(Num2);a2=polyfit(xdata2,Num2,1);y2=polyval(a2,xdata2);figure;plot(y2,'b-*');hold on;plot(Num2,'r-*');a2%人数曲线拟合figure;x2=1:Max_num;y2=5*a2(1)*x2+a2(2);plot(y2,x2,'r-*');title('前景边缘人数');grid on;1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删