m基于形态学处理和SVM的视频行人密集度分析matlab仿真

简介: m基于形态学处理和SVM的视频行人密集度分析matlab仿真

1.算法描述

   行人检测技术已经成为计算机视觉领域的关键研究方向。行人检测的最重要的任务就是对行人目标进行准确定位。行人检测技术有很强的使用价值,可以与多人跟踪、行人重识别等技术结合,应用于汽车无人驾驶系统、智能机器人、智能视频监控、人体行为分析、人流量统计系统、智能交通领域。

   目前的行人检测任务主要为基于图像特征的方法。基于图像特征的方法,主要通过手动构造行人特征,如hog等,再结合svm、adaboost等分类器训练检测器来实现行人检测。在实际场景下,多个行人与摄像头之间的距离远近不一,摄像头捕获的图像中行人尺寸不同,而现有检测过程中的特征尺寸单一,无法覆盖所有的待检测行人尺寸,出现漏检情况,导致检测效果不佳。另外,在密集人群场景下,行人之间会出现重叠情况,检测出多个目标的候选区域框距离比较近时,在最终去掉重复任务的检测框时,容易误除,导致密集行人检测效果不佳。

   支持向量机(support vector machines, SVM)是二分类算法,所谓二分类即把具有多个特性(属性)的数据分为两类,目前主流机器学习算法中,神经网络等其他机器学习模型已经能很好完成二分类、多分类,学习和研究SVM,理解SVM背后丰富算法知识,对以后研究其他算法大有裨益;在实现SVM过程中,会综合利用之前介绍的一维搜索、KKT条件、惩罚函数等相关知识。本篇首先通过详解SVM原理,后介绍如何利用python从零实现SVM算法。
     实例中样本明显的分为两类,黑色实心点不妨为类别一,空心圆点可命名为类别二,在实际应用中会把类别数值化,比如类别一用1表示,类别二用-1表示,称数值化后的类别为标签。每个类别分别对应于标签1、还是-1表示没有硬性规定,可以根据自己喜好即可,需要注意的是,由于SVM算法标签也会参与数学运算,这里不能把类别标签设为0。

52e1fd5df0006e31104e1805d6275aa7_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png
a5b5dcff11d25c6127c98817264b7cfb_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png
7f35b51e31e2b1147a8926b9ab2df932_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

2.仿真效果预览
matlab2022a仿真结果如下:

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

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

这样写可以专门用来读取连续编号的图片序列作为视屏。

886c9711e19f19d4625b0249dfbc5583_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

第二步:提取背景

对应的代码如下所示:

//以上就是求解图像的差分

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

//获得背景

877494e2700293832deccf90697d5387_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

第三步:当前图片与背景的差

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
这里求解差,并将得到的结果求二值图

e8e20e1a043dff5bf5a7fc7d8ca882d5_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

第四步:形态学处理

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
这里我们主要将视屏中的个别噪点去掉使画面更加’干净’;

ca92eebe888168c90ef3dfe3642c8bfc_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

第五步:边缘检测

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

普通边间求解法

ac057e67c94371112ee3479b62022bef_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

统计人员像素并分析出对应的密集度。
9e0737eca9c6f920c652b85d63f9860b_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png
8e96ba86baf57edc3049cf279e9e87fc_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png
f56a971868b04904c6f157e87ca7af84_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png
5c6cfeb2e0db5da2d58d9ba6f5fe7725_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png
56ca0525fbeffd60090a8002d6103ed6_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png
46561ffa6aa5059ab1f48c4251954867_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png
image.png

3.MATLAB核心程序

list       = dir('Vedio\02\*.jpg');
level      = 60;
level2     = 0.25;
level3     = 8000;%用来区分低密度还是中高密度的门限值
level4     = 1200;
flag       = 0;%1:低密度,0:高密度
density    = 1;%定义一个密度变量,记录不同时刻的密度变化
 
 
%step1:读取图片序列
[n_frames,I3] = func_readvedio(folder,list);
%step2:提取背景
back3 = func_getbackground(I3,n_frames,level);
rows = size(I3,1);    
cols = size(I3,2); 
clear  folder list;
 
%由于是基于视屏的,所以下面采用一个循环的处理方法进行处理,每次只处理一个图片
for k = 1:n_frames%下面的处理都是基于逐帧的
    disp('当前帧数');k
    %step3:背景差
    images2(1:rows,1:cols,k) = func_subbackground(I3(1:rows,1:cols,k),back3,level2); 
    %step4:形态学处理
    images3(1:rows,1:cols,k) = func_Xintai(images2(1:rows,1:cols,k)); 
    %step5:统计前景像素数目
    Num(k) = func_pixel(images3(1:rows,1:cols,k));
    
    
        %低密度
        %低密度
        %低密度
        %低密度
        if Num(k) < level3%说明是低密度
        flag       = 1;    
            %step6:边缘检测
            images4(1:rows,1:cols,k) = func_edgecheck(images3(1:rows,1:cols,k));
            %step7:统计前景边缘像素数目
            Num2(k) = func_pixel(images4(1:rows,1:cols,k));
            
            
              if Num2(k) <level4
              disp('人口密度很低,密度等级:1');    
              density(k) = 1;
              else
              disp('人口密度低  ,密度等级:2'); 
              density(k) = 2;
              end    
    
        end
        %高密度
        %高密度
        %高密度
        %高密度        
        if Num(k) > level3%说明是中高密度
        flag       = 0;    
        %人群密度特征提取
        d=1;
        [Energy8_0(k),Contrast8_0(k),Correlation8_0(k),Homogeneity8_0(k)] = func_different_L_features(images3(1:rows,1:cols,k),k,d); 
        
        
        
        level = 8;    
        %选取0度和90度的作为训练数据
        [train1_data_0,train1_data_90,train2_data_0,train2_data_90,test_data_0,test_data_90]=func_loaddata(level);
        %high_low = 1; %中密度分类值
        %high_low = -1;%高密度分类值
        %输出结果为error=1,说明不是该类;输出为0,说明属于某类型
        %0度数据的训练
        [error01,Output01] = func_classifer(train1_data_0,train2_data_0,test_data_0,1);
        [error02,Output02] = func_classifer(train1_data_0,train2_data_0,test_data_0,-1);
        %90度数据的训练
        %[error901,Output901] = func_classifer(train1_data_90,train2_data_90,test_data_90,1);            
        %[error902,Output902] = func_classifer(train1_data_90,train2_data_90,test_data_90,-1);     
            if error01 == 0 & error02 == 1   
            disp('人口密度高  ,密度等级:4');
            density(k) = 4;
            end
            if error01 == 1 & error02 == 0
            disp('人口密度中  ,密度等级:3');
            density(k) = 3;
            end
        end    
        figure(1);
        imshow(I3(1:rows,1:cols,k));
        title(['人口密度等级',num2str(density(k))]);
        drawnow
end
 
 
if flag == 1
figure;    
%1随帧数变化前景像素数变化曲线
subplot(211);plot(Num,'b-*');title('随帧数变化前景像素数变化曲线');
 
 
%3前景人数与人数的拟合曲线
%曲线拟合
xdata1=1:length(Num);
a1=polyfit(xdata1,Num,1);
y1=polyval(a1,xdata1);
%人数曲线拟合
x1=1:8;
y1=5*a1(1)*x1+a1(2);
subplot(212);plot(y1,x1,'r-*');
title('前景人数与人数的拟合曲线');
 
end
相关文章
|
4天前
|
资源调度 监控 算法
基于扩频解扩+LDPC编译码的QPSK图传通信系统matlab误码率仿真,扩频参数可设置
该通信系统主要用于高质量图像传输,如无人机、视频监控等场景。系统采用QPSK调制解调、扩频技术和LDPC译码,确保复杂电磁环境下的稳定性和清晰度。MATLAB仿真(2022a)验证了算法效果,核心程序包括信道编码、调制、扩频及解调等步骤,通过AWGN信道测试不同SNR下的性能表现。
28 6
基于扩频解扩+LDPC编译码的QPSK图传通信系统matlab误码率仿真,扩频参数可设置
|
2天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于PPO强化学习的buckboost升降压电路控制系统matlab仿真,对比PID控制器
本项目利用MATLAB 2022a对基于PPO强化学习的Buck-Boost电路控制系统进行仿真,完整代码无水印。通过与环境交互,智能体学习最优控制策略,实现输出电压稳定控制。训练过程包括初始化参数、收集经验数据、计算优势和奖励函数并更新参数。附带操作视频指导,方便用户理解和应用。
25 12
|
5天前
|
算法
基于PSO粒子群优化的配电网可靠性指标matlab仿真
本程序基于PSO粒子群优化算法,对配电网的可靠性指标(SAIFI、SAIDI、CAIDI、ENS)进行MATLAB仿真优化。通过调整电网结构和设备配置,最小化停电频率和时长,提高供电连续性和稳定性。程序在MATLAB 2022A版本上运行,展示了优化前后指标的变化。PSO算法模拟鸟群行为,每个粒子代表一个潜在解决方案,通过迭代搜索全局最优解,实现配电网的高效优化设计。
|
3天前
|
机器学习/深度学习 算法
基于遗传优化的双BP神经网络金融序列预测算法matlab仿真
本项目基于遗传优化的双BP神经网络实现金融序列预测,使用MATLAB2022A进行仿真。算法通过两个初始学习率不同的BP神经网络(e1, e2)协同工作,结合遗传算法优化,提高预测精度。实验展示了三个算法的误差对比结果,验证了该方法的有效性。
|
5天前
|
机器学习/深度学习 数据采集 算法
基于PSO粒子群优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目展示了基于PSO优化的CNN-GRU-SAM网络在时间序列预测中的应用。算法通过卷积层、GRU层、自注意力机制层提取特征,结合粒子群优化提升预测准确性。完整程序运行效果无水印,提供Matlab2022a版本代码,含详细中文注释和操作视频。适用于金融市场、气象预报等领域,有效处理非线性数据,提高预测稳定性和效率。
|
2天前
|
算法
基于梯度流的扩散映射卡尔曼滤波算法的信号预处理matlab仿真
本项目基于梯度流的扩散映射卡尔曼滤波算法(GFDMKF),用于信号预处理的MATLAB仿真。通过设置不同噪声大小,测试滤波效果。核心代码实现数据加载、含噪信号生成、扩散映射构建及DMK滤波器应用,并展示含噪与无噪信号及滤波结果的对比图。GFDMKF结合非线性流形学习与经典卡尔曼滤波,提高对非线性高维信号的滤波和跟踪性能。 **主要步骤:** 1. 加载数据并生成含噪测量值。 2. 使用扩散映射捕捉低维流形结构。 3. 应用DMK滤波器进行状态估计。 4. 绘制不同SNR下的轨迹示例。
|
6天前
|
机器学习/深度学习 算法 索引
单目标问题的烟花优化算法求解matlab仿真,对比PSO和GA
本项目使用FW烟花优化算法求解单目标问题,并在MATLAB2022A中实现仿真,对比PSO和GA的性能。核心代码展示了适应度计算、火花生成及位置约束等关键步骤。最终通过收敛曲线对比三种算法的优化效果。烟花优化算法模拟烟花爆炸过程,探索搜索空间,寻找全局最优解,适用于复杂非线性问题。PSO和GA则分别适合快速收敛和大解空间的问题。参数调整和算法特性分析显示了各自的优势与局限。
|
5月前
|
安全
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
本文介绍了2023年高教社杯数学建模竞赛D题的圈养湖羊空间利用率问题,包括问题分析、数学模型建立和MATLAB代码实现,旨在优化养殖场的生产计划和空间利用效率。
240 6
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
|
5月前
|
存储 算法 搜索推荐
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现
本文提供了2022年华为杯数学建模竞赛B题的详细方案和MATLAB代码实现,包括方形件组批优化问题和排样优化问题,以及相关数学模型的建立和求解方法。
144 3
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现
|
5月前
|
数据采集 存储 移动开发
【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码
本文介绍了2023年五一杯数学建模竞赛B题的解题方法,详细阐述了如何通过数学建模和MATLAB编程来分析快递需求、预测运输数量、优化运输成本,并估计固定和非固定需求,提供了完整的建模方案和代码实现。
113 0
【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码

热门文章

最新文章