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

1.算法描述

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


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


支持向量机(support vector machines, SVM)是二分类算法,所谓二分类即把具有多个特性(属性)的数据分为两类,目前主流机器学习算法中,神经网络等其他机器学习模型已经能很好完成二分类、多分类,学习和研究SVM,理解SVM背后丰富算法知识,对以后研究其他算法大有裨益;在实现SVM过程中,会综合利用之前介绍的一维搜索、KKT条件、惩罚函数等相关知识。本篇首先通过详解SVM原理,后介绍如何利用python从零实现SVM算法。

实例中样本明显的分为两类,黑色实心点不妨为类别一,空心圆点可命名为类别二,在实际应用中会把类别数值化,比如类别一用1表示,类别二用-1表示,称数值化后的类别为标签。每个类别分别对应于标签1、还是-1表示没有硬性规定,可以根据自己喜好即可,需要注意的是,由于SVM算法标签也会参与数学运算,这里不能把类别标签设为0。


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


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



第二步:提取背景


对应的代码如下所示:




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


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


//获得背景



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


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


普通边间求解法



统计人员像素并分析出对应的密集度。



3.MATLAB核心程序

folder     = 'Vedio\02\';

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,377评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,390评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,967评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,344评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,441评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,492评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,497评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,274评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,732评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,008评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,184评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,837评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,520评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,156评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,407评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,056评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,074评论 2 352

推荐阅读更多精彩内容