MATLAB人体异常行为检测

  • 课题介绍

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

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

  • GUI界面

  • 篇幅安排

四、源码:

  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

    end

    

    frame_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');

                

            elseif K>2.5

                title('慢跑中','Color','B');

            elseif K>0

                title('步行中','Color','G');

            else

                title('静止中');

            end

        else

            title('图像中无人');

        end

        pause(0.1);

    end

end

  1. 摔倒检测代码

% 获取视频文件

[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']);

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(6*pi*261.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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值