人口密度检测

·低密度人群代码说明中文文档及补充说明

·代码列表

·代码使用说明

     这套代码的使用只针对低密度的人群密度,即人群密度的统计的满足能够分辨单个的人,即视频中不存在多个人叠加的情况。

     代码MATLAB2007b,运行即开始运行本代码。

·设计方案说明

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

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('µÍÃܶÈÈË¿ÚÃܶÈ');

第七步:拟合说明

     这个步骤主要是通过求的的像素值与实际存在的人数进行拟合。其拟合效果如下所示:

 

通过拟合得到人数和像素数的关系曲线为:

即在低密度的条件下,像素数和人数的关系曲线。

 

 

·高密度人群代码说明中文文档

里面的代码的说明如下所示:

Test:测试视屏中提取的视屏特征参数保存的文件夹;

Train1:高密度训练视屏中提取的视屏特征参数保存的文件夹;

Train2:中密度训练视屏中提取的视屏特征参数保存的文件夹;

Vedio:保存视屏的文件;

 

 

 

 

 

 

 

 

 

 

 

 

 

分类函数

灰度共生矩阵的相关性参数

求背景

求灰度共生矩阵函数

灰度共生矩阵子函数

加载数据

画图函数

计算CDM最长0点位置函数

读取视屏函数

背景相减函数

形态学处理还输

SVM分类核函数

系统运行主函数

SVM分类画图

SVM子函数

测试文件,无用。。

 

 

系统包括如下几个部分:

 

 

 

 

 

 

其中前面三个部分均为特征提取函数。这里以高密度特征提取为例子:

前面的四个步骤都是相同的。

然后是步骤五。灰度共生矩阵特征参数的提取。

其步骤为:

其主函数为:

 

其中的主要函数为

 

这里主要利用到了MATLAB的内置函数graycomatrix进行求解灰度共生矩阵;

然后利用函数graycoprops求其每个角度的特征参数

然后通过如下的代码求的0,45,90,135四个角度的共生矩阵的各个特征参数;

 

 

 

 

 

这个代码段就是将灰度共生矩阵参数保存到相应的文档中。

 

然后后几个视屏的灰度共生矩阵的特征参数的提取也是同样的步骤进行。

 

注意,在计算特征参数的时候,有四种情况,就是分别计算了灰度等级为8,16,32,64四种情况下的特征参数。

 

这里首先选择灰度等级,8,16,32,64等等。

然后进行数据加载。

然后这里的high_low就是进行识别测试数据是高密度还是中密度的选中函数。

最后两个就是通过0度和90度的特征参数进行分类。

 

测试步骤:

假设不知道测试的视频的人口密度情况;

然后首先输入high_low = 1;

然后运行代码:

得到如下的运行结果:

这个说明输入的测试视频和低密度的特征参数是一类的。则说明测试参数是低密度视频

 

 

 

 

加入认为输入的视频是高密度。那么high_low = -1;然后运行代码;

这是错误的。这说明输入的不是高密度,是低密度。

通过这样对比,完成一组视频的测试,判断输入的视频是中密度还是高密度。

 

 

 

 

猜你喜欢

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