一、课题介绍

本文设计了一款MATLAB的人体行为异常监控系统,主要适用人群是老年人,在摄像头固定的情况下,自动检测人体运动轨迹,并与提前设定好的行为库进行匹配,分析判断是否具有异常行为。

在数字图像预处理部分采用了图像二值化,腐蚀与膨胀等几种方法为人体目标的跟踪和检测做准备。为了克服在实际操作中遇到的问题,采用了帧差法和ViBe算法,帧差法即利用帧间变化与当前帧、背景算法来判断它是否大于阈值,并分析视频中序列的运动特性,ViBe算法则是一种背景建模的方法,背景模型是由邻域像素来创建,并对比背景模型、当前输入像素值检测出前景,确定视频中的目标跟踪。在人体行为识别中,运动目标最小长宽比以及连续帧间的加速度来判断人体行为是否异常,如果检测到异常的行为比如说摔倒、快跑等行为,在识别的过程这种实时监测。

二、GUI界面

异常自动恢复执行情况监控页面 异常行为监控_异常自动恢复执行情况监控页面


异常自动恢复执行情况监控页面 异常行为监控_matlab_02


三、篇幅安排

异常自动恢复执行情况监控页面 异常行为监控_异常自动恢复执行情况监控页面_03


异常自动恢复执行情况监控页面 异常行为监控_异常自动恢复执行情况监控页面_04

四、源码:
1、快跑检测代码

[filename, pathname] = uigetfile({ ‘.’},‘打开视频’);
 videoName = [pathname filename];
 Objs=VideoReader(videoName);
 Nums=Objs.NumberOfFrames;%读取视频的帧数
 FrameRate=Objs.FrameRate;%每秒多少帧
 %% <ViBe算法____>%%
 %% 设定参数
 sample_num = 10; % 样本库
 match_thres = 20; % 匹配阈值
 frame_count = 0; % 处理帧数
 neighbor = [1, 0, -1, -1, 1, 0, 0, -1, 1]; % 邻域选择
 %% 判断是否为第一帧
 first_flag = true;
 for num=1:1:Nums
 frame = read(Objs,num);
 frame_gray = double(rgb2gray(frame));
 if first_flag
 first_flag = false;
 %% 开始初始化
 samples = cell(1, sample_num);
 % 前两个样本设置初始像素
 samples{1} = frame_gray;
 samples{2} = frame_gray;
 % 剩下的样本初始化
 for i = 3:sample_num
 samples{i} = frame_gray + double(floor(rand(rows, cols) * 20) - 10);
 end
 fore_count = uint8(zeros(rows, cols));
 frame_count = frame_count + 1;
 % 初始化结束
 continue
 end
 %% 前景分割
 fgMask = uint8(ones(rows, cols) * match_num);
 for i = 1:sample_num
 distance = uint8(abs(samples{i} - frame_gray) <= match_thres);
 fgMask = fgMask - distance;
 end
 fgMask = logical(fgMask * 255);
 % 更新前景计数
 for r = 1 : rows
 for c = 1:cols
 if fgMask(r, c) == 1
 fore_count(r, c) = fore_count(r, c) + 1;
 if fore_count(r, c) >= fore_thres
 fore_count(r,c) = 0;
 fgMask(r, c) = 0;
 end
 else
 fore_count(r, c) = 0;
 end
 end
 end
 updateMask = fgMask;
 updateMask = imfill(updateMask, ‘hole’);
 %% 更新样本库
 % 一边更新前景计数,一边更新样本库
 for r = 2:rows-1
 for c = 2:cols-1
 % 为背景时,更新背景样本库
 if updateMask(r, c) == 0
 fore_count(r, c) = 0;
 % 有一定概率更新自身
 if update_factor == 1 || floor(rand() * update_factor) == 0
 samples{floor(rand() * sample_num) + 1}(r, c) = frame_gray(r, c);
 end
 % 也有一定概率更新周围像素样本库
 if update_factor == 1 || floor(rand() * update_factor) == 0
 samples{floor(rand() * sample_num) + 1}(r + neighbor(floor(rand() * 9) + 1), …
 c + neighbor(floor(rand() * 9) + 1)) = frame_gray(r, c);
 end
 end
 end
 endframe_count = frame_count + 1;
if frame_count >= 50
    update_factor = next_update_factor;
end    
fgMask = imopen(fgMask, strel('rectangle', [3, 3]));
fgMask = imfill(fgMask, 'hole');% subplot(1,2,1);
 axes(handles.axes1);
 imshow(frame);
 drawnow;%刷新屏幕
 %subplot(1,2,2);
 %imshow(fgMask);
 % drawnow;%刷新屏幕
 A = zhixin(fgMask);
 if num >4
 if A >0
 K = abs( W(num-2,1) - A);
 if K>5
 %%黑-》绿-》蓝-》-》红,风险等级依次提高
 title(‘快跑中’,‘Color’,‘R’);
 %风险过高报警提示
 fs=20000; %确定采样频率
 t=0: 1/fs: 0.2; %t为音长
 c=sin(6pi261.63 *t); %中央c的频率为261.63Hz
 sound(c, fs);
 elseif K>2.5
 title(‘慢跑中’,‘Color’,‘B’);
 elseif K>0
 title(‘步行中’,‘Color’,‘G’);
 else
 title(‘静止中’);
 end
 else
 title(‘图像中无人’);
 end
 pause(0.1);
 end
 end2、摔倒检测代码
 % 获取视频文件
 [filename, pathname] = uigetfile({ ‘.’},‘打开视频’);
 videoName = [pathname filename];
 obj=VideoReader(videoName);
 numFrames = obj.NumberOfFrames;% 帧的总数
 mkdir(‘Xmt’);
 for k = 1 : numFrames% 读取数据
 frame = read(obj,k);
 imwrite(frame,[‘Xmt’,num2str(k),’.jpg’],‘jpg’);% 保存帧
 % axes(handles.axes1);
 %imshow(frame);
 %drawnow;
 end
 k=25;
 mkdir(‘result’);
 while(k<300)
 %提取人体框架
 beijing=imread([‘Xmt’,num2str(k+10),’.jpg’]);
 mubiao=imread([‘Xmt’,num2str(k+12),’.jpg’]);
 bw_img2=rentiGJ(beijing,mubiao);
 beijing=imread([‘Xmt’,num2str(k),’.jpg’]);
 mubiao=imread([‘Xmt’,num2str(k+2),’.jpg’]);
 bw_img=rentiGJ(beijing,mubiao);
 if(total<300000)
 %状态判断
 bili=abs(heigth/length);
 if ((bili<=1)&&(10<=(zyy2-zyy)))
 b=‘跌倒’;
 else
 b=‘正常’;
 end%标注状态
 axes(handles.axes1);
 imshow(mubiao);
 drawnow;
 if(strcmp(b,‘跌倒’))
 text1=text(xx,yy,[‘状态:’,b,‘中’]);
 set(text1,‘Color’,‘R’,‘FontWeight’,‘demi’);
 %风险过高报警提示
 fs=10000; %确定采样频率
 t=0: 1/fs: 0.5; %t为音长
 c=sin(6pi261.63 *t); %中央c的频率为261.63Hz
 sound(c, fs);
 else
 text1=text(xx,yy,[‘状态:’,b,‘中’]);
 set(text1,‘Color’,‘G’,‘FontWeight’,‘demi’);
 end
 % rectangle(‘position’,[xx,yy,length,heigth],‘edgecolor’,‘r’);
 %储存结果
 saveas(gcf,[‘result’,num2str(k+1),’.jpg’]);
 end
 k=k+20;
 end