MATLAB人体行为检测与识别
人体行为检测与识别是当前研究的重点,具有很高的研究价值和广阔的应用前景。主要应用在型人机交互、运动分析、智能监控和虚拟现实也称灵境技术(VR)领域,对于研究人体检测和识别有着重要的意义。因为人的运动的复杂性和对外部环境的多变性,使得人们行为识别和检测具有一些挑战。对人类行为和检测的研究目前处于初级阶段,有待进一步研究和开发。
本文基于matlab人体行为识别和检测的研究,本文主要研究的是从图像中判断出目标处于何种行为,例如常见的走、坐、躺、跑、跳等行为的识别。从现有的很多主流研究成果来看,最常见的行为识别系统结构包括几个模块:目标检测、目标跟踪、行为识别。本文首先对图像进行判断是否有人体目标,识别出人体后对图像进行灰度化,在对灰度图像用背景差法与背景图像比对,最后,比对提取出的人体来判断人体处于何种行为。
随着社会的发展,人民生活的提高,人们越来越关注安全问题,对视频监控系统的需求也爆发式扩张,如停车场,超市,银行,工厂,矿山等安全有监控设备,但监控系统不会主动实时监控。因为它们通常在相机发生后的异常,但只有在记录进行了观察和分析,以捕获存储的视频图像结果,然后知事实发生。因此迫切需要一种监视系统,它能够在24小时的连续实时监测,并且相机自动分析人类行为识别的有效的分析所捕获的图像数据。此外,当发生异常时,系统能够守护人员准确及时报警,从而避免犯罪和其他异常情况的发生。随着监控系统到位,以帮助人们甚至完成监控任务。可以减少人力和财力的投入,由于就业监视人员进行。另外,如果长时间不运动图像信息记录,保存几下,就失去了意义和视频监控系统的存储资源浪费存储空间。因此,传统的监视系统浪费了大量的人力,并有可能引起报警,性能差的实时监控的泄漏。监控等实时行为分析系统来识别人体,不仅可以替代监控人员的工作的一部分,提高监测系统的自动化水平,同时也提高监视存储的效率,还有一个广泛的应用,并在视频监视系统的潜在经济价值之前。由于人的行为具有自由的伟大程度,因为身体宽松长裙不同程度和它的外貌和从图像捕获设备位置不同距离的表现风格将是一个很大的分歧,这是人的行为分析,找出了一定的难度。但是,人类行为的实时分析,智能监控系统,以确定关键技术及其广阔的前景药,安全性,虚拟现实,军事和潜在的经济价值,国内外研究机构和学者越来越多的关注,并在许多全球领先的刊物和会议专题讨论。美国和欧洲都进行了一些相关的研究项目。 VSAM主要项目,如美国国防部高级研究计划局,成立于1997年(视觉监视和监测),主要是在视频为主的视频场景理解技术的战场和民用研究;IBM和微软等公司越来越多地将基于视觉的手势识别技术集成到其业务。 W4的实时可视化监控系统已经能够实现定位以及人体运动和跟踪能力的人的分割,并能检测一个人是否携带物体的简单动作等等;重大项目导师制欧盟委员会Framework5计划成立于1999年,主要是对人的行为和人机交互的研究,以开发用于公共安全,安全管理系统的工具; DARPA在2000年和资助长期的人类行为识别(识别人类在距离)项目,主要用于国防研究预防恐怖袭击和民间的多模态监测技术;雷丁大学,英国已经推出了理性的项目(稳健的方法进行监测和了解的人在公共场所),ETISE(视频场景理解评估),ISCAPS(拥挤区域治安综合监控),人类的主要研究行为在视觉图像识别和场景的理解;此外还有Pfinder(人发现者)系统,该系统可以执行人民和谅解的行为,以及项目AVITRACK(飞机周围,归类车辆和个人跟踪围裙的活动模型解释和检查)实时跟踪,是共同资助欧盟和奥地利的研究,该项目的重点是视频监控技术的研究。国内机构这方面的研究也有自动化研究所模式识别,微软亚洲研究院,感知,北京大学国家实验室,大学这方面的研究国家实验室有清华大学,浙江大学。虽然起步相对较晚的时间,而且还对关键技术进行深入研究人的视觉分析。人类的行为识别主要用于运动图像序列中含有人体的分析和处理,往往涉及的检测和清除运动目标检测,运动物体的阴影,特征提取和的四个过程识别人的行为的描述和分析的运动。在这里,我们从人的行为识别技术的研究现状,以及人的行为识别技术的热点和难点,讨论四个方面阐述。
人体行为检测与识别技术除了在智能监控系统中具有有广泛的应用前景和潜力,在计算机视觉中是一个极具有吸引力及挑战性的问题。人体运动的视觉分析是一个新兴前沿的研究领域,涉及模式识别,图像处理,计算机视觉,人工智能等多门学科。它可以广泛应用于许多领域,如:运动捕捉,人机交互,监控和安全,环境控制和监测,体育及娱乐分析等,特别是在视频监控方面可广泛应用于银行、邮电、教育、交通、公安、监狱、法庭、大型公共设施、公共场所(银行、医院、停车场、商店、等公共场所甚至家庭庭院内)、大型仓库及军事基地等场所,在国防与公共安全领域起着日益重要的作用。综上所述,因此,人体动作的视觉分析具有极大的商业价值与现实意义。
本文主要对人体行为检测和识别方法进行研究,主要研究内容如下:
(1)判断是否为人体
在目标提取之前,首先要对输入的图片进行检测。本文通过肤色检测判断目标是否为人体。
(2)人体目标提取
如果是人体导入背景图片与背景图片做差,再通过背景差阈值分割法进行提取。
(4)行为识别
在解决了以上的问题之后,接下来就是要选择一种合适的算法来进行人体姿态识别,这也是本文研究的重点和难点。本文采用一种人体目标的连通区域的长宽比例来对人体行为进行识别。
图2-2(1)卧姿的人脸定位
图2-2(2)跳跃的人脸定位
图2-2(3)行走时的人脸定位
图2-2(4)坐姿的人脸定位
图2-2(5)奔跑时的人脸定位
sit walk
图3-3(1)
在这部分,将结合具体的源代码具体说明系统的执行流程和逻辑。
%申明数据库的位置
input = 'dataset';
%申明前景检测输出图像的位置
output = 'forground';
output2 = 'result';
str1 = dir(input); %存储每个动作的文件夹
bk = imread('bk.png');%读入背景图片
bk = rgb2gray(bk);
% 彩色背景转灰度背景
threshold = 40; %背景差阈值
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);
for y = 1:length(str2) % 循环每个图片
y
%读入图片
im = imread([input '\' str1(x).name '\' str2(y).name]);
im_gray = rgb2gray(im);%彩色图转灰度图
diff = abs(double(im_gray) - double(bk));
fg = diff>threshold; % 背景差阈值分割法,求前景
fg = medfilt2(fg); %中值滤波去噪点
bb = regionprops(fg,'BoundingBox');
area = regionprops(fg,'Area');
%寻找最大连通域的外接框的坐标
max_index = 1;
max_area = 0;
%计算外接框的长宽比
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)
% 判断外接框内是否有肤色, 如果有肤色, 才是人, 才进入行为判断
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;
for z = 1:size(bb_skin,1)
if bb_skin(z).BoundingBox(2) <= min_height;
min_height = bb_skin(z).BoundingBox(2);
min_index = z;
end
end
c2 = floor(bb(max_index).BoundingBox(1))+floor(bb_skin(min_index).BoundingBox(1)) ; %x
r2 = floor(bb(max_index).BoundingBox(2))+floor(bb_skin(min_index).BoundingBox(2)); %y
c_width2 = bb_skin(min_index).BoundingBox(3); %x_with
r_width2 = bb_skin(min_index).BoundingBox(4); % y_with
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
%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
if radio<=0.54 && radio>0.5
text(c-5,r-5,'walk') ;
end
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');