1.软件版本
matlab2015b
2.算法概述
人群密度情况分为三个等级,(1)稀少和不拥挤情况下为绿色提醒。(2)比较拥挤情况下,黄色预警。(3)非常拥挤情况下,红色报警。 不同人群密度情况通过相应的报警级别在界面上实时显示出来
人群密度分类两种思路:
(1)估计在景人数,根据人数多少,判断人群密度情形。
(2)提取分析人群的整体特征,训练样本,利用分类器学习分类。
首先对视频进行纹理提取,采用的方法是灰度共生矩阵:
http://wenku.baidu.com/view/d60d9ff5ba0d4a7302763ae1.html?from=search
然后通过GRNN神经网络训练识别算法:
广义回归神经网络(Generalized regression neural network, GRNN)是一种建立在非参数核回归基础之上的神经网络,通过观测样本计算自变量和因变量之间的概率密度函数。GRNN结构如图1所示,整个网络包括四层神经元:输入层、模式层、求和层与输出层。

GRNN神经网络的性能,主要通过对其隐回归单元的核函数的光滑因子来设置的,不同的光滑因子可获得不同的网络性能。输入层的神经元数目与学习样本中输入向量的维数m相等。每个神经元都分别对应一个不同的学习样本,模式层中第i个神经元的传递函数为:


由此可以看出,当选择出学习样本之后,GRNN网络的结构与权值都是完全确定的,因而训练GRNN网络要比训练BP网络和RBF网络便捷得多。根据上述GRNN网络的各个层的输出计算公式,整个GRNN网络的输出可用如的式子表示:

3.部分源码
  
   - 
    
     
    
    
     
      function pushbutton2_Callback(hObject, eventdata, 
      handles)
     
    
- 
    
     
    
    
     
      % hObject    handle 
      to pushbutton2 (see GCBO)
     
    
- 
    
     
    
    
     
      % eventdata  reserved - 
      to be defined 
      in a future version 
      of MATLAB
     
    
- 
    
     
    
    
     
      % 
      handles    
      structure 
      with 
      handles 
      and user data (see GUIDATA)
     
    
- 
    
     
    
    
     
      global frameNum_Original;
     
    
- 
    
     
    
    
     
      global frameNum_Originals;
     
    
- 
    
     
    
    
     
      global Obj;
     
    
- 
    
     
    
    
     
      %%
     
    
- 
    
     
    
    
     
      %参数初始化
     
    
- 
    
     
    
    
     
      %处理视频大小
     
    
- 
    
     
    
    
     
      RR = 
      200;
     
    
- 
    
     
    
    
     
      CC = 
      300;
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      K                   = 
      3;                   %组件
     
    
- 
    
     
    
    
     
      Alpha               = 
      0.02;                %适应权重速度
     
    
- 
    
     
    
    
     
      Rho                 = 
      0.01;                %适应权重速度协方差
     
    
- 
    
     
    
    
     
      Deviation_sq        = 
      49;                  %阈值用于查找匹配 
     
    
- 
    
     
    
    
     
      Variance            = 
      2;                   %初始方差为新放置组件
     
    
- 
    
     
    
    
     
      Props               = 
      0.00001;             %最初为新放置 
     
    
- 
    
     
    
    
     
      Back_Thresh         = 
      0.8;                 %体重的比例必须占背景模型
     
    
- 
    
     
    
    
     
      Comp_Thresh         = 
      10;                  %滤掉连接组件的较小的尺寸
     
    
- 
    
     
    
    
     
      SHADOWS             =[
      0.7,
      0.25,
      0.85,
      0.95]; %设置阴影去除门限值
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      CRGB  = 
      3;
     
    
- 
    
     
    
    
     
      D     = RR * CC;
     
    
- 
    
     
    
    
     
      Temps = zeros(RR,CC,CRGB,
      'uint8');
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      Temps = imresize(read(Obj,
      1),[RR,CC]);
     
    
- 
    
     
    
    
     
      Temps = reshape(Temps,size(Temps,
      1)*size(Temps,
      2),size(Temps,
      3));      
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      Mus                 = zeros(D,K,CRGB);
     
    
- 
    
     
    
    
     
      Mus(:,
      1,:)          = 
      double(Temps(:,:,
      1));
     
    
- 
    
     
    
    
     
      Mus(:,
      2:K,:)        = 
      255*rand([D,K-
      1,CRGB]);
     
    
- 
    
     
    
    
     
      Sigmas              = Variance*ones(D,K,CRGB); 
     
    
- 
    
     
    
    
     
      Weights             = [ones(D,
      1),zeros(D,K-
      1)];
     
    
- 
    
     
    
    
     
      Squared             = zeros(D,K);    
     
    
- 
    
     
    
    
     
      Gaussian            = zeros(D,K);     
     
    
- 
    
     
    
    
     
      Weight              = zeros(D,K);
     
    
- 
    
     
    
    
     
      background          = zeros(RR,CC,frameNum_Original);
     
    
- 
    
     
    
    
     
      Shadows             = zeros(RR,CC);
     
    
- 
    
     
    
    
     
      Images0             = zeros(RR,CC,frameNum_Original);        
     
    
- 
    
     
    
    
     
      Images1             = zeros(RR,CC,frameNum_Original);  
     
    
- 
    
     
    
    
     
      Images2             = zeros(RR,CC,frameNum_Original);   
     
    
- 
    
     
    
    
     
      background_Update   = zeros(RR,CC,CRGB,frameNum_Original); 
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      indxx               = 
      0; 
     
    
- 
    
     
    
    
     
      for tt = frameNum_Originals
     
    
- 
    
     
    
    
     
          disp(
      '当前帧数');
     
    
- 
    
     
    
    
     
          tt
     
    
- 
    
     
    
    
     
          indxx            = indxx + 
      1; 
     
    
- 
    
     
    
    
     
          pixel_original   = read(Obj,tt);
     
    
- 
    
     
    
    
     
          pixel_original2  = imresize(pixel_original,[RR,CC]);
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
         
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
          Temp = zeros(RR,CC,CRGB,
      'uint8');
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
          Temp = pixel_original2;
     
    
- 
    
     
    
    
     
          Temp = reshape(Temp,size(Temp,
      1)*size(Temp,
      2),size(Temp,
      3));  
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
          image = Temp;
     
    
- 
    
     
    
    
         
      for kk = 
      1:K   
     
    
- 
    
     
    
    
     
              Datac         = 
      double(Temp)-reshape(Mus(:,kk,:),D,CRGB);
     
    
- 
    
     
    
    
     
              Squared(:,kk) = sum((Datac.^ 
      2)./reshape(Sigmas(:,kk,:),D,CRGB),
      2); 
     
    
- 
    
     
    
    
         
      end
     
    
- 
    
     
    
    
     
          [junk,index] = min(Squared,[],
      2); 
     
    
- 
    
     
    
    
     
          Gaussian                                                = zeros(size(Squared));
     
    
- 
    
     
    
    
     
          Gaussian(sub2ind(size(Squared),
      1:length(index),index
      ')) = ones(D,1);
     
    
- 
    
     
    
    
     
          Gaussian                                                = Gaussian&(Squared<Deviation_sq);
     
    
- 
    
     
    
    
     
          %参数更新
     
    
- 
    
     
    
    
     
          Weights = (
      1-Alpha).*Weights+Alpha.*Gaussian;
     
    
- 
    
     
    
    
         
      for kk = 
      1:K
     
    
- 
    
     
    
    
     
              pixel_matched   = repmat(Gaussian(:,kk),
      1,CRGB);
     
    
- 
    
     
    
    
     
              pixel_unmatched = abs(pixel_matched-
      1);
     
    
- 
    
     
    
    
     
              Mu_kk           = reshape(Mus(:,kk,:),D,CRGB);
     
    
- 
    
     
    
    
     
              Sigma_kk        = reshape(Sigmas(:,kk,:),D,CRGB);
     
    
- 
    
     
    
    
     
              Mus(:,kk,:)     = pixel_unmatched.*Mu_kk+pixel_matched.*(((
      1-Rho).*Mu_kk)+(Rho.*
      double(image)));
     
    
- 
    
     
    
    
     
              Mu_kk           = reshape(Mus(:,kk,:),D,CRGB); 
     
    
- 
    
     
    
    
     
              Sigmas(:,kk,:)  = pixel_unmatched.*Sigma_kk+pixel_matched.*(((
      1-Rho).*Sigma_kk)+repmat((Rho.* sum((
      double(image)-Mu_kk).^
      2,
      2)),
      1,CRGB));       
     
    
- 
    
     
    
    
         
      end
     
    
- 
    
     
    
    
     
          replaced_gaussian   = zeros(D,K); 
     
    
- 
    
     
    
    
     
          mismatched          = find(sum(Gaussian,
      2)==
      0);       
     
    
- 
    
     
    
    
         
      for ii = 
      1:length(mismatched)
     
    
- 
    
     
    
    
     
              [junk,index]                            = min(Weights(mismatched(ii),:)./sqrt(Sigmas(mismatched(ii),:,
      1)));
     
    
- 
    
     
    
    
     
              replaced_gaussian(mismatched(ii),index) = 
      1;
     
    
- 
    
     
    
    
     
              Mus(mismatched(ii),index,:)             = image(mismatched(ii),:);
     
    
- 
    
     
    
    
     
              Sigmas(mismatched(ii),index,:)          = ones(
      1,CRGB)*Variance;
     
    
- 
    
     
    
    
     
              Weights(mismatched(ii),index)           = Props;  
     
    
- 
    
     
    
    
         
      end
     
    
- 
    
     
    
    
     
          Weights         = Weights./repmat(sum(Weights,
      2),
      1,K);
     
    
- 
    
     
    
    
     
          active_gaussian = Gaussian+replaced_gaussian;
     
    
- 
    
     
    
    
     
          %背景分割 
     
    
- 
    
     
    
    
     
          [junk,index]    = sort(Weights./sqrt(Sigmas(:,:,
      1)),
      2,
      'descend');
     
    
- 
    
     
    
    
     
          bg_gauss_good   = index(:,
      1);
     
    
- 
    
     
    
    
     
          linear_index    = (index-
      1)*D+repmat([
      1:D]
      ',1,K);
     
    
- 
    
     
    
    
     
          weights_ordered = Weights(linear_index);
     
    
- 
    
     
    
    
         
      for kk = 
      1:K
     
    
- 
    
     
    
    
     
              Weight(:,kk)= sum(weights_ordered(:,
      1:kk),
      2);
     
    
- 
    
     
    
    
         
      end
     
    
- 
    
     
    
    
     
          bg_gauss(:,
      2:K) = Weight(:,
      1:(K-
      1)) < Back_Thresh;
     
    
- 
    
     
    
    
     
          bg_gauss(:,
      1)   = 
      1;           
     
    
- 
    
     
    
    
     
          bg_gauss(linear_index)     = bg_gauss;
     
    
- 
    
     
    
    
     
          active_background_gaussian = active_gaussian & bg_gauss;
     
    
- 
    
     
    
    
     
          foreground_pixels          = abs(sum(active_background_gaussian,
      2)-
      1);
     
    
- 
    
     
    
    
     
          foreground_map             = reshape(sum(foreground_pixels,
      2),RR,CC);
     
    
- 
    
     
    
    
     
          Images1                    = foreground_map;   
     
    
- 
    
     
    
    
     
          objects_map                = zeros(size(foreground_map),
      'int32');
     
    
- 
    
     
    
    
     
          object_sizes               = [];
     
    
- 
    
     
    
    
     
          Obj_pos                    = [];
     
    
- 
    
     
    
    
     
          new_label                  = 
      1;
     
    
- 
    
     
    
    
     
          %计算连通区域
     
    
- 
    
     
    
    
     
          [label_map,num_labels]     = bwlabel(foreground_map,
      8);
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
         
      for label = 
      1:num_labels 
     
    
- 
    
     
    
    
            
      object      = (label_map == label);
     
    
- 
    
     
    
    
     
             object_size = sum(sum(
      object));
     
    
- 
    
     
    
    
            
      if(object_size >= Comp_Thresh)
     
    
- 
    
     
    
    
     
                objects_map             = objects_map + int32(
      object * new_label);
     
    
- 
    
     
    
    
     
                object_sizes(new_label) = object_size;
     
    
- 
    
     
    
    
     
                [X,Y]                   = meshgrid(
      1:CC,
      1:RR);    
     
    
- 
    
     
    
    
     
                object_x                = X.*
      object;
     
    
- 
    
     
    
    
     
                object_y                = Y.*
      object;
     
    
- 
    
     
    
    
     
                Obj_pos(:,new_label)    = [sum(sum(object_x)) / object_size;
     
    
- 
    
     
    
    
     
                                           sum(sum(object_y)) / object_size];
     
    
- 
    
     
    
    
     
                new_label               = new_label + 
      1;
     
    
- 
    
     
    
    
            
      end
     
    
- 
    
     
    
    
         
      end
     
    
- 
    
     
    
    
     
          num_objects = new_label - 
      1;
     
    
- 
    
     
    
    
     
          %去除阴影
     
    
- 
    
     
    
    
     
          index                       = sub2ind(size(Mus),reshape(repmat([
      1:D],CRGB,
      1),D*CRGB,
      1),reshape(repmat(bg_gauss_good
      ',CRGB,1),D*CRGB,1),repmat([1:CRGB]',D,1));
     
    
- 
    
     
    
    
     
          background                  = reshape(Mus(index),CRGB,D);
     
    
- 
    
     
    
    
     
          background                  = reshape(background
      ',RR,CC,CRGB); 
     
    
- 
    
     
    
    
     
          background                  = uint8(background);
     
    
- 
    
     
    
    
         
      if  indxx <= 
      500;
     
    
- 
    
     
    
    
     
              background_Update           = background;
     
    
- 
    
     
    
    
         
      else
     
    
- 
    
     
    
    
     
              background_Update           = background_Update;
     
    
- 
    
     
    
    
         
      end
     
    
- 
    
     
    
    
             
     
    
- 
    
     
    
    
         
     
    
- 
    
     
    
    
         
     
    
- 
    
     
    
    
     
          background_hsv              = rgb2hsv(background);
     
    
- 
    
     
    
    
     
          image_hsv                   = rgb2hsv(pixel_original2);
     
    
- 
    
     
    
    
         
      for i = 
      1:RR
     
    
- 
    
     
    
    
             
      for j = 
      1:CC      
     
    
- 
    
     
    
    
                 
      if (objects_map(i,j))&&...
     
    
- 
    
     
    
    
     
                     (abs(image_hsv(i,j,
      1)-background_hsv(i,j,
      1))<
      SHADOWS(
      1))&&...
     
    
- 
    
     
    
    
     
                     (image_hsv(i,j,
      2)-background_hsv(i,j,
      2)<
      SHADOWS(
      2))&&...
     
    
- 
    
     
    
    
     
                     (
      SHADOWS(
      3)<=image_hsv(i,j,
      3)/background_hsv(i,j,
      3)<=
      SHADOWS(
      4))
     
    
- 
    
     
    
    
                    
      Shadows(i,j) = 
      1;  
     
    
- 
    
     
    
    
                 
      else
     
    
- 
    
     
    
    
                    
      Shadows(i,j) = 
      0;  
     
    
- 
    
     
    
    
                 
      end               
     
    
- 
    
     
    
    
             
      end    
     
    
- 
    
     
    
    
         
      end
     
    
- 
    
     
    
    
     
          Images0           = objects_map;
     
    
- 
    
     
    
    
     
          objecs_adjust_map = 
      Shadows;
     
    
- 
    
     
    
    
     
          Images2           = objecs_adjust_map;    
     
    
- 
    
     
    
    
         
     
    
- 
    
     
    
    
         
     
    
- 
    
     
    
    
         
     
    
- 
    
     
    
    
         
     
    
- 
    
     
    
    
     
          %%
     
    
- 
    
     
    
    
     
          %根据像素所在区域大小比例以及纹理特征分析获得人密度
     
    
- 
    
     
    
    
     
          %腐蚀处理
     
    
- 
    
     
    
    
     
          se        = strel(
      'ball',6,6);
     
    
- 
    
     
    
    
     
          Images2BW = floor(abs(imdilate(Images2,se)-
      5));
     
    
- 
    
     
    
    
     
          Images3BW = zeros(size(Images2BW));
     
    
- 
    
     
    
    
     
          X1 = round(
      168/
      2);
     
    
- 
    
     
    
    
     
          X2 = round(
      363/
      2);
     
    
- 
    
     
    
    
     
          Y1 = round(
      204/
      2);
     
    
- 
    
     
    
    
     
          Y2 = round(
      339/
      2);
     
    
- 
    
     
    
    
         
      if indxx > 
      80;
     
    
- 
    
     
    
    
     
             %计算区域内像素值
     
    
- 
    
     
    
    
     
             S1           = sum(sum(Images2BW(Y1:Y2,X1:X2)));
     
    
- 
    
     
    
    
     
             S2(indxx-
      80) = S1/((X2-X1)*(Y2-Y1)); 
     
    
- 
    
     
    
    
         
      end
     
    
- 
    
     
    
    
     
          Images3BW(Y1:Y2,X1:X2)   = Images2BW(Y1:Y2,X1:X2);
     
    
- 
    
     
    
    
     
          Images3Brgb              = pixel_original2(Y1:Y2,X1:X2,:);
     
    
- 
    
     
    
    
     
          %纹理检测
     
    
- 
    
     
    
    
     
          %计算纹理
     
    
- 
    
     
    
    
     
          [A,B]     = func_wenli(rgb2gray(Images3Brgb));
     
    
- 
    
     
    
    
     
          %选择能量 熵作为判断依据
     
    
- 
    
     
    
    
         
      if indxx > 
      80;
     
    
- 
    
     
    
    
     
             F1(indxx-
      80) = A(
      1);
     
    
- 
    
     
    
    
     
             F2(indxx-
      80) = A(
      2);
     
    
- 
    
     
    
    
     
             F3(indxx-
      80) = A(
      3);
     
    
- 
    
     
    
    
         
      end
     
    
- 
    
     
    
    
         
      if indxx > 
      80;
     
    
- 
    
     
    
    
     
              load train_model.mat
     
    
- 
    
     
    
    
     
              P     = [S2(indxx-
      80);F2(indxx-
      80)];
     
    
- 
    
     
    
    
     
              y     = round(NET(P));
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
             
      if y == 
      1
     
    
- 
    
     
    
    
                
      set(
      handles.text2,
      'String','低密度'); 
     
    
- 
    
     
    
    
                
      set(
      handles.text2,
      'ForegroundColor',[0 1 0]) ;
     
    
- 
    
     
    
    
             
      end
     
    
- 
    
     
    
    
             
      if y == 
      2
     
    
- 
    
     
    
    
                
      set(
      handles.text2,
      'String','中密度'); 
     
    
- 
    
     
    
    
                
      set(
      handles.text2,
      'ForegroundColor',[1 1 0]) ;
     
    
- 
    
     
    
    
             
      end    
     
    
- 
    
     
    
    
             
      if y == 
      3
     
    
- 
    
     
    
    
                
      set(
      handles.text2,
      'String','高密度'); 
     
    
- 
    
     
    
    
                
      set(
      handles.text2,
      'ForegroundColor',[1 0 0]) ;
     
    
- 
    
     
    
    
             
      end    
     
    
- 
    
     
    
    
         
      end
     
    
- 
    
     
    
    
         
     
    
- 
    
     
    
    
         
     
    
- 
    
     
    
    
         
     
    
- 
    
     
    
    
         
     
    
- 
    
     
    
    
     
          axes(
      handles.axes1)
     
    
- 
    
     
    
    
     
          imshow(pixel_original2);
     
    
- 
    
     
    
    
     
      %     title(
      '定位检测区域');
     
    
- 
    
     
    
    
     
          hold 
      on
     
    
- 
    
     
    
    
     
          line([X1,X2],[Y1,Y1],
      'LineWidth',1,'Color',[0 1 0]);
     
    
- 
    
     
    
    
     
          hold 
      on
     
    
- 
    
     
    
    
     
          line([X2,X2],[Y1,Y2],
      'LineWidth',1,'Color',[0 1 0]);
     
    
- 
    
     
    
    
     
          hold 
      on
     
    
- 
    
     
    
    
     
          line([X2,X1],[Y2,Y2],
      'LineWidth',1,'Color',[0 1 0]); 
     
    
- 
    
     
    
    
     
          hold 
      on
     
    
- 
    
     
    
    
     
          line([X1,X1],[Y2,Y1],
      'LineWidth',1,'Color',[0 1 0]); 
     
    
- 
    
     
    
    
         
     
    
- 
    
     
    
    
         
     
    
- 
    
     
    
    
     
          axes(
      handles.axes2)
     
    
- 
    
     
    
    
     
          imshow(uint8(background_Update));
     
    
- 
    
     
    
    
     
      %     title(
      '背景获得');
     
    
- 
    
     
    
    
         
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
          axes(
      handles.axes3)
     
    
- 
    
     
    
    
     
          imshow(Images0,[]);
     
    
- 
    
     
    
    
     
      %     title(
      '动态背景提取'); 
     
    
- 
    
     
    
    
     
          axes(
      handles.axes4)
     
    
- 
    
     
    
    
     
          imshow(Images3BW,[]);
     
    
- 
    
     
    
    
     
      %     title(
      '动态背景提取(检测区域内)'); 
     
    
- 
    
     
    
    
         
     
    
- 
    
     
    
    
         
     
    
- 
    
     
    
    
     
          pause(
      0.0000001);
     
    
- 
    
     
    
    
     
      end
     
    
4.仿真结果

转载:https://blog.csdn.net/ccsss22/article/details/125568328
