基于matlab视频的人体姿态检测
设计目的和要求
1.根据已知要求分析视频监控中行人站立和躺卧姿态检测的处理流程,确定视频监中行人的检测设计的方法,画出流程图,编写实现程序,并进行调试,录制实验视频,验证检测方法的基于MATLAB的人体姿态
- 设计原理
首先利用统计的方法得到背景模型,并实时地对背景模型进行更新以适应光线变化和场景本身的变化,用形态学方法和检测连通域面积进行后处理,消除噪声和背景扰动带来的影响,在HSV色度空间下检测阴影,得到准确的运动目标。
噪声的影响,会使检测结果中出现一些本身背景的区域像素点被检测成运动区域,也可能是运动目标内的部分区域被漏检。另外,背景的扰动,如树枝、树叶的轻微摇动,会使这部分也被误判断为运动目标,为了消除这些影响,首先对上一步的检测结果用形态学的方法进行处理,在找出经过形态学处理的后的连通域,计算每个连通域中的面积,对于面积小于一定值的区域,将其抛弃,不看做是前景运动目标。
- 设计内容
2.1课题意义
随着监控系统到位,以帮助人们甚至完成监控任务。可以减少人力和财力的投入,由于就业监视人员进行。另外,如果长时间不运动图像信息记录,保存几下,就失去了意义和视频监控系统的存储资源浪费存储空间。因此,传统的监视系统浪费了大量的人力,并有可能引起报警,性能差的实时监控的泄漏。监控等实时行为分析系统来识别人体,不仅可以替代监控人员的工作的一部分,提高监测系统的自动化水平,同时也提高监视存储的效率,还有一个广泛的应用,并在视频监视系统的潜在经济价值之前。由于人的行为具有自由的伟大程度,因为身体宽松长裙不同程度和它的外貌和从图像捕获设备位置不同距离的表现风格将是一个很大的分歧,这是人的行为分析,找出了一定的难度。但是,人类行为的实时分析,智能监控系统,以确定关键技术及其广阔的前景药,安全性,虚拟现实,军事和潜在的经济价值,国内外研究机构和学者越来越多的关注,并在许多全球领先的刊物和会议专题讨论。美国和欧洲都进行了一些相关的研究项目。
2.2运动分割算法
首先利用统计的方法得到背景模型,并实时地对背景模型进行更新以适应光线变化和场景本身的变化,用形态学方法和检测连通域面积进行后处理,消除噪声和背景扰动带来的影响,在HSV色度空间下检测阴影,得到准确的运动目标。
本次采用了基于累积差分和数学形态学处理的运动区域提取算法。在时域窗口内,首先对图象进行降级处理得到灰度带图象,对灰度带差分图象累积并进行数学形态学处理得到运动目标的轨迹模版,将轨迹模版与当前帧差分图象与运算得到当前帧运动目标象素,最后进行多级数学形态学处理得到当前帧运动区域。实验结果表明,该算法不仅能够对静止背景序列运动区域有较好的分割结果,而且在没有进行全局运动补偿的情况下,对部分运动背景序列也能成功的提取出运动区域。
2.3方案设计
根据设计要求确定视频监控中行人分割和人体姿态识别的方法,选择确定运动目标检测、行人人体姿态特征信息提取实现方法。画出流程图见附录2并对各部分功能进行说明。
(1)判断是否为人体
在目标提取之前,首先要对输入的图片进行检测。本文通过连通域的面积来检测判断目标是否为人体。
(2)人体目标提取
如果是人体导入背景图片与背景图片做差,再通过背景差阈值分割法进行提取。 (4)行为识别
在解决了以上的问题之后,接下来就是要选择一种合适的算法来进行人体姿态识别,这也是本文研究的重点和难点。本文采用人体目标的连通区域的长宽比例和方向角的方法来对人体行为进行识别。
- 过程实现
根据设计要求确定视频中行人检测和人体姿态特征信息提取方法,进行程序设计,编写实现程序,使用matlab等软件。
3.3.1图像分割中运动的运用(运动目标检测)
运动目标检测首先利用统计的方法得到背景模型,并实时地对背景模型进行更新以适应光线变化和场景本身的变化,用形态学方法和检测连通域面积进行后处理,消除噪声和背景扰动带来的影响,在HSV色度空间下检测阴影,得到准确的运动目标。
图3.3.3—1对站立姿势的判断
在躺卧时,视频的上方会出现“躺卧”的文字,如下图3.3—2 所示
图3.3—2对躺卧姿势的判断
图3.3.3—3对其他姿势的的判断
参考源码
% Approximate Median Filter background model for moving object segmentation.
%采用近似中值滤波背景模型参考图像实现运动目标分割
clear all; close all;
% Construct a videoreader class to read a avi file, first the 'car_parking.avi' ,
% then the ‘highwayII_raw.avi'.
videoObj = VideoReader('gyz.avi');
numFrames =videoObj.NumberOfFrames;
%Get the speed of the AVI movie in frames per second (fps)
FPS = videoObj.FrameRate;
% Read the first frame in the video sequence as the initial value
newframe = read(videoObj, 1);
fmed = double(newframe);
% Get the height, width, and number of color components of the frame
[height, width, numColor] = size(newframe);
% Assign a value to the threshold
Threh = 20;
beta = 0.6;
fg = false(height, width);
%创建方形结构元素,用于对分割结果形态学滤波
se = strel('square',3);
% To avoid consuming too much memories, read only a one frame each time.
for n = 100:400
newframe = read(videoObj, n);
% Calculate the differrence image between the new frame and fmed
Idiff = double(newframe) - fmed;
% Update the median of each pixel value
pixInc = find(Idiff > 0);
fmed(pixInc) = fmed(pixInc) + beta;
pixDec = find(Idiff < 0);
fmed(pixDec) = fmed(pixDec) - beta;
% Motion segment, detection moving object by threholding Idiff
fg = abs(Idiff) >Threh;
if ( numColor == 3) % color image
fg = fg(:, :, 1) | fg(:, :, 2) | fg(:, :, 3);
end
figure(1);
subplot(2,3,1), imshow(newframe);
title(strcat('Current Image, No. ', int2str(n)));
subplot(2,3,2), imshow(fg);
title('Segmented result using Approximate Median Filter');
subplot(2,3,3), imshow(fg2);
title('Segmented result using morphological filter');
pause(0.01)
[L,num]=bwlabel(fg2,4);%对连通域进行标记,num=6
img_reg = regionprops(L, 'Area', 'Orientation', 'boundingbox');
%测量标注矩阵 L中每一个标注区域的area、orientation、boundingbox属性。
all = [ img_reg.Area];%求出6个连通域的像素个数
[d,ind]=max(all);%得到面积最大的连通域
or = [img_reg.Orientation];
or_m(n)=or(ind);%得到视频每一帧的最大连通域的方向角
%对每一帧图像的方向角进行判断姿态
subplot(2,3,4), imshow(newframe);
if (or_m(n)>ori_low)&&(or_m(n)<ori_high)
title(strcat('躺卧,NO. ', int2str(n)));
elseif (or_m(n)>ors_low)&&(or_m(n)<ors_high)
title(strcat('站立,NO. ', int2str(n)));
elseif title(strcat('其他,NO. ', int2str(n)));
end
%对每一帧图像的长宽比进行判断姿态
subplot(2,3,5), imshow(newframe);
if ratio(n)<bo_t1&&ratio(n)>bo_t2
title(strcat('躺卧,NO. ', int2str(n)));
elseif ratio(n)>bo_z1&&ratio(n)<bo_z2
title(strcat('站立,NO. ', int2str(n)));
elseif title(strcat('其他,NO. ', int2str(n)));
end
end