天天看点

基于MATLAB的人体行为检测与识别

一、课题背景

人体行为检测与识别是当前研究的重点,具有很高的研究价值和广阔的应用前景。主要应用在型人机交互、运动分析、智能监控和虚拟现实也称灵境技术(VR)领域,对于研究人体检测和识别有着重要的意义。因为人的运动的复杂性和对外部环境的多变性,使得人们行为识别和检测具有一些挑战。对人类行为和检测的研究目前处于初级阶段,有待进一步研究和开发。

本文基于matlab人体行为识别和检测的研究,本文主要研究的是从图像中判断出目标处于何种行为,例如常见的走、坐、躺、跑、跳等行为的识别。从现有的很多主流研究成果来看,最常见的行为识别系统结构包括几个模块:目标检测、目标跟踪、行为识别。本文首先对图像进行判断是否有人体目标,识别出人体后对图像进行灰度化,在对灰度图像用背景差法与背景图像比对,最后,比对提取出的人体来判断人体处于何种行为。

二、 研究意义

人体行为检测与识别技术除了在智能监控系统中具有有广泛的应用前景和潜力,在计算机视觉中是一个极具有吸引力及挑战性的问题。人体运动的视觉分析是一个新兴前沿的研究领域,涉及模式识别,图像处理,计算机视觉,人工智能等多门学科。它可以广泛应用于许多领域,如:运动捕捉,人机交互,监控和安全,环境控制和监测,体育及娱乐分析等,特别是在视频监控方面可广泛应用于银行、邮电、教育、交通、公安、监狱、法庭、大型公共设施、公共场所(银行、医院、停车场、商店、等公共场所甚至家庭庭院内)、大型仓库及军事基地等场所,在国防与公共安全领域起着日益重要的作用。综上所述,因此,人体动作的视觉分析具有极大的商业价值与现实意义。

三、 研究内容

本文主要对人体行为检测和识别方法进行研究,主要研究内容如下:

(1)判断是否为人体

在目标提取之前,首先要对输入的图片进行检测。本文通过肤色检测判断目标是否为人体。

(2)人体目标提取

如果是人体导入背景图片与背景图片做差,再通过背景差阈值分割法进行提取。

(4)行为识别

基于MATLAB的人体行为检测与识别

在解决了以上的问题之后,接下来就是要选择一种合适的算法来进行人体姿态识别,这也是本文研究的重点和难点。本文采用一种人体目标的连通区域的长宽比例来对人体行为进行识别。

四、实现示例
基于MATLAB的人体行为检测与识别
基于MATLAB的人体行为检测与识别

图2-2(1)卧姿的人脸定位

基于MATLAB的人体行为检测与识别
基于MATLAB的人体行为检测与识别

图2-2(2)跳跃的人脸定位

基于MATLAB的人体行为检测与识别
基于MATLAB的人体行为检测与识别

图2-2(3)行走时的人脸定位

基于MATLAB的人体行为检测与识别
基于MATLAB的人体行为检测与识别

图2-2(4

基于MATLAB的人体行为检测与识别
基于MATLAB的人体行为检测与识别

)坐姿的人脸定位

图2-2(5)

奔跑时的人脸定位

附录1 部分关键源码及解释

在这部分,将结合具体的源代码具体说明系统的执行流程和逻辑。

%申明数据库的位置

input = 'dataset';

%申明前景检测输出图像的位置

output = 'forground';

output2 = 'result';

str1 = dir(input); %存储每个动作的文件夹

bk = imread('bk.png');%读入背景图片

bk = rgb2gray(bk);

% 彩色背景转灰度背景

threshold = 40; %背景差阈值

radio_jump = [];

radio_lie = [];

radio_run = [];

radio_sit = [];

radio_walk = [];

for x = 3:length(str1) %循环每个动作文件夹

x

str2 = dir([input '\' str1(x).name '\*.png']); %存储每个动作文件中的图片信息

mkdir_fun(output, str1(x).name); % 在前景输出文件夹中,为每个动作创建文件夹

mkdir_fun(output2, str1(x).name);

%[x y x_with y_with]

%计算外接框的长宽比

radio = bb(max_index).BoundingBox(3)/bb(max_index).BoundingBox(4);

if x == 3

radio_jump = [radio_jump;radio];

end

if x == 4

radio_lie = [radio_lie;radio];

end

if x == 5

radio_run = [radio_run;radio];

end

if x == 6

radio_sit = [radio_sit;radio];

end

if x == 7

radio_walk = [radio_walk;radio];

end

imshow(im)

% 判断外接框内是否有肤色, 如果有肤色, 才是人, 才进入行为判断

c = floor(bb(max_index).BoundingBox(1)) ; %x

r = floor(bb(max_index).BoundingBox(2)); %y

c_width = bb(max_index).BoundingBox(3); %x_with

r_width = bb(max_index).BoundingBox(4); % y_with

rectangle('Position', [c r c_width r_width])

sum_im = im(r:r+r_width,c:c+c_width,:); %外接框图像

skin = skin_fun(sum_im); %寻找是否有肤色

skin = medfilt2(skin);

bb_skin = regionprops(skin,'BoundingBox'); %如果有肤色,切割出连通域

min_index = 1;

min_height = 720;

if size(bb_skin,1) >=1 %如果找到肤色

rectangle('Position', [c r c_width r_width])

rectangle('Position', [c2 r2 c_width2 r_width2])

text(c2+c_width2+5,r+r_width2+5,'face') ;

%jump

if radio<= 0.5

text(c-5,r-5,'jump') ;

end

%lie

if radio>= 1

text(c-5,r-5,'lie') ;

end

%run

if radio >0.54 && radio<0.6

text(c-5,r-5,'run') ;

end

%sit

if radio >=0.6 && radio <1

text(c-5,r-5,'sit') ;

end

%walk

else %如果没找到肤色

text(c-5,r-5,'No Human') ;

end

saveas(gcf,[output2 '\' str1(x).name '\' str2(y).name]);

pause(0.005)

imwrite(fg,[output '\' str1(x).name '\' str2(y).name]);

end

end

plot(radio_jump,'b');

hold on;

plot(radio_lie,'g');

hold on;

plot(radio_run,'k');

hold on;

plot(radio_sit,'y');

hold on;

plot(radio_walk,'r');

继续阅读