m公交车上车乘客实时计数系统matlab仿真

1.算法仿真效果

matlab2022a仿真结果如下:

 

 

 

2.算法涉及理论知识概要

视频预处理:

 

主要包括视频防抖处理,噪声干扰滤波处理等步骤

 

头部提取:

 

由于这里,需要统计的人数,其主要特征是头部信息较为完整,而身体部分存在较大的重叠,所以这里我们主要对头部进行提取。

 

具体思路如下:

 

       目标提取,获得视频的运动部分;

 

       背景去除,干扰去除,通过这个步骤,获得无背景干扰的运动目标

 

       通过提取头部头发纹理以及脸部特征的方法获得每个目标的头部,并通过边缘检测的方法,提取头部轮廓信息。

 

数量统计:

 

        通过特征匹配的方法,对检测到的轮廓,分析出对应的是否是头部,如果是头部,就进行计数统计。

 

整个算法的整体流程图如下图所示:

 

 

 

         中值滤波是一种非线性滤波,由于它在实际运算过程中并不需要图像的统计特性,所以比较方便。中值滤波首先是被应用在一维信号处理技术中,后来被二维图像信号处理技术所应用。在一定的条件下,可以克服线性滤波器所带来的图像细节模糊,而且对滤除脉冲干扰及图像扫描噪声最为有效。中值滤波的目的是保护图像边缘的同时去除噪声。

 

        阶跃形的边缘,Canny推导出的最优边缘检测器的形状与高斯函数和一阶导数类似,因此Canny边缘检测器就是由高斯函数的一阶导数构成的。我们知道,高斯函数是圆对称的,因此Canny算子在边缘方向上是对称的,在垂直于边缘的方向上是反对称的。这就意味着该算子对最急剧的变化方向上的边缘特别敏感,但在沿边缘方向上是不敏感的。

 

        根据Canny的定义,中心边缘点为算子nG与图像f(x,y)的卷积在边缘梯度方向上的区域中的最大值。这样,就可以在每一点的梯度方向上判断此点强度是否为其领域的最大值来确定该点是否为边缘点。当一个像素满足以下三个条件时,则被认为是图像的边缘点。

 

1)该点的边缘强度大于沿该点梯度方向的两个相邻像素点的边缘强度;

 

2)与该点梯度方向上相邻两点的方向差小于45度;

 

3)以该点为中心的33´领域中的边缘强度极大值小于某个阈值。  此外,如果(1)和(2)同时被满足,那么在梯度方向上的两相邻像素就从候选边缘点中取消,条件(3)相当于区域梯度最大值组成的阈值图像与边缘点进行匹配,这一过程消除了许多虚假的边缘点。  图像边缘检测的基本步骤:

 

1) 滤波,边缘检测主要基于导数计算,但受噪声的影响。但滤波器在降低噪 声的同时也导致了边缘强度的损失。

 

2) 增强,增强算法将邻域咴度有显著变化的点突出显示。一般通过计算梯度 幅值完成。  (3) 检测,但在有些图像中梯度幅值较大的并不是边缘点。最简单的边缘检测 是梯度幅值阈值的判定。

 

4) 定位,精确确定边缘的位置。

 

        一般情况下,获得的边缘,会存在较大的缺口,这里,我们使用膨胀处理,修复边缘,膨胀原理如下所示:

 

       假定二值图像A和形态学处理的结构元素B是定义在笛卡儿网格上的集合,网格中值为1的点是集合的元素,当结构元素的原点移到点(x,y)时,记为Sxy

 

       膨胀是以得到B的相对与它自身原点的映像并且由z对映像进行移位为基础的。AB膨胀是所有位移z的集合,这样, 和A至少有一个元素是重叠的。我们可以把上式改写为: 结构元素B可以看作一个卷积模板,区别在于膨胀是以集合运算为基础的,卷积是以算术运算为基础的,但两者的处理过程是相似的。

 

⑴ 用结构元素B,扫描图像A的每一个像素

 

⑵ 用结构元素与其覆盖的二值图像做“与”操作

 

⑶ 如果都为0,结果图像的该像素为0。否则为1

 

 

 

3.MATLAB核心程序

 

save func\tmps.mat L1 X1 X2 Y1 Y2 I
else
    CNT = CNT + 1;
    if xlag == 1 & CNT <= 5;
       load func\tmps.mat
       Xc(frm) = (X1(I)+X2(I))/2;
       Yc(frm) = (Y1(I)+Y2(I))/2;
    else
       Xc(frm) = 0;
       Yc(frm) = 0;  
    end
end
 
if frm > 1 & mod(frm,2) == 0
   Xc1 = Xc(frm);
   Yc1 = Yc(frm);
   save func\xy1.mat  Xc1 Yc1
end
if frm > 1 & mod(frm,2) == 1
   Xc2 = Xc(frm);
   Yc2 = Yc(frm);
   save func\xy2.mat  Xc2 Yc2
end
 
if frm > 4
   load func\xy1.mat
   load func\xy2.mat
   
   if sqrt((Xc1 - Xc2)^2 + (Yc1 - Yc2)^2) > 80 & Yc2 - Yc1 > 0
      PEOPLE = PEOPLE + 1;
   end
end   
 
[R1,C1,K] = size(I0);
 
I_final = I0;
for i = 1:R1
    for j = 1:C1
        if L1(i,j,1) == 255 
           I_final(i,j,1) = 255;
           I_final(i,j,2) = 0;
           I_final(i,j,3) = 0;
        end
    end
end

 

  

 

posted @ 2023-05-07 18:27  我爱C编程  阅读(44)  评论(0编辑  收藏  举报