【视频人员密集程度检测计数】基于MATLAB的人员密集程度检测计数仿真

1.软件版本

matlab2013b

2.部分核心代码

第一步:读取图片视屏序列

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;

3.参考文献

A10-07

4.完整源码获得方式

方式1:微信或者QQ联系博主

方式2:订阅MATLAB/FPGA教程,免费获得教程案例以及任意2份完整源码

猜你喜欢

转载自blog.csdn.net/ccsss22/article/details/124217872