基于视频的人体姿态检测

这篇具有很好参考价值的文章主要介绍了基于视频的人体姿态检测。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

基于视频的人体姿态检测

  • 设计目的和要求

1.根据已知要求分析视频监控中行人站立和躺卧姿态检测的处理流程,确定视频监中行人的检测设计的方法,画出流程图,编写实现程序,并进行调试,录制实验视频,验证检测方法的有效性,完成系统软件设计。

2.基本教学要求:每人一台计算机,计算安装matlab、visio等软件。

  • 设计原理

2.1图像分割中运动的运用(运动目标检测)

首先利用统计的方法得到背景模型,并实时地对背景模型进行更新以适应光线变化和场景本身的变化,用形态学法和检测连通域面积进行后处理,消除噪声和背景扰动带来的影响,在HSV色度空间下检测阴影,得到准确的运动目标。

噪声的影响,会使检测结果中出现一些本身背景的区域像素点被检测成运动区域,也可能是运动目标内的部分区域被漏检。另外,背景的扰动,如树枝、树叶的轻微摇动,会使这部分也被误判断为运动目标,为了消除这些影响,首先对上一步的检测结果形态学的方法进行处理,在找出经过形态学处理的后的连通域,计算每个连通域中的面积,对于面积小于一定值的区域,将其抛弃,不看做是前景运动目标。

    1.  bwlabel函数

用法:L = bwlabel(BW,n)

[L,num] = bwlabel(BW,n)这里num返回的就是BW中连通区域的个数。

返回一个和BW大小相同的L矩阵,包含了标记了BW中每个连通区域的类别标签,这些标签的值为1、2、num(连通区域的个数)。n的值为4或8,表示是按4连通寻找区域,还是8连通寻找,默认为8。

四连通或八连通是图像处理里的基本感念:8连通,是说一个像素,如果和其他像素在上、下、左、右、左上角、左下角、右上角或右下角连接着,则认为他们是联通的;4连通是指,如果像素的位置在其他像素相邻的上、下、左或右,则认为他们是连接着的,连通的,在左上角、左下角、右上角或右下角连接,则不认为他们连通。

2.3 regionprops统计被标记的区域的面积分布,显示区域总数

函数regionprops语法规则为:STATS = regionprops(L,properties)

该函数用来测量标注矩阵L中每一个标注区域的一系列属性。L中不同的正整数元素对应不同的区域,例如:L中等于整数1的元素对应区域1;L中等于整数2的元素对应区域2;以此类推。返回值STATS是一个 长度为max(L(:))的结构数组,结构数组的相应域定义了每一个区域相应属性下的度量。

Properties可以是由逗号分割的字符串列表、包含字符 串的单元数组、单个字符串'all'或者'basic'。如果properties等于字符串'all',则表4.1中的度量数据都将被计算;如果properties等于字符串'basic',则属性:'Area','Centroid'和'BoundingBox'将被计算。

'Area'—— 图像各个区域中像素总个数
'BoundingBox' —— 包含相应区域的最小矩形

'Orientation' 与区域具有相同标准二阶中心矩的椭圆的长轴与x轴的交角(度)

  • 设计内容

3.1理论依据

3.1.1应用背景与意义

随着监控系统到位,以帮助人们甚至完成监控任务。可以减少人力和财力的投入,由于就业监视人员进行。另外,如果长时间不运动图像信息记录,保存几下,就失去了意义和视频监控系统的存储资源浪费存储空间。因此,传统的监视系统浪费了大量的人力,并有可能引起报警,性能差的实时监控的泄漏。监控等实时行为分析系统来识别人体,不仅可以替代监控人员的工作的一部分,提高监测系统的自动化水平,同时也提高监视存储的效率,还有一个广泛的应用,并在视频监视系统的潜在经济价值之前。由于人的行为具有自由的伟大程度,因为身体宽松长裙不同程度和它的外貌和从图像捕获设备位置不同距离的表现风格将是一个很大的分歧,这是人的行为分析,找出了一定的难度。但是,人类行为的实时分析,智能监控系统,以确定关键技术及其广阔的前景药,安全性,虚拟现实,军事和潜在的经济价值,国内外研究机构和学者越来越多的关注,并在许多全球领先的刊物和会议专题讨论。美国和欧洲都进行了一些相关的研究项目。

3.1.2运动分割算法

首先利用统计的方法得到背景模型,并实时地对背景模型进行更新以适应光线变化和场景本身的变化,用形态学法和检测连通域面积进行后处理,消除噪声和背景扰动带来的影响,在HSV色度空间下检测阴影,得到准确的运动目标。

本次采用了基于累积差分和数学形态学处理的运动区域提取算法。在时域窗口内,首先对图象进行降级处理得到灰度带图象,对灰度带差分图象累积并进行数学形态学处理得到运动目标的轨迹模版,将轨迹模版与当前帧差分图象与运算得到当前帧运动目标象素,最后进行多级数学形态学处理得到当前帧运动区域。实验结果表明,该算法不仅能够对静止背景序列运动区域有较好的分割结果,而且在没有进行全局运动补偿的情况下,对部分运动背景序列也能成功的提取出运动区域。

3.1.3研究人体姿态的特征描述

'BoundingBox' —— 包含相应区域的最小矩形

'Orientation' 与区域具有相同标准二阶中心矩的椭圆的长轴与x轴的交角(度)

3.2方案设计

根据设计要求确定视频监控中行人分割和人体姿态识别的方法,选择确定运动目标检测、行人人体姿态特征信息提取实现方法。画出流程图见附录2并对各部分功能进行说明。

(1)判断是否为人体

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

(2)人体目标提取     

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

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

3.3程序设计

根据设计要求确定视频中行人检测和人体姿态特征信息提取方法,进行程序设计,编写实现程序,使用matlab等软件。

3.3.1图像分割中运动的运用(运动目标检测)

运动目标检测首先利用统计的方法得到背景模型,并实时地对背景模型进行更新以适应光线变化和场景本身的变化,用形态学法和检测连通域面积进行后处理,消除噪声和背景扰动带来的影响,在HSV色度空间下检测阴影,得到准确的运动目标。

该段程序读取了视频从100帧到400帧的图像。先对导入视频采用近似中值滤波背景模型参考图像实现运动目标分割,然后创建边长为3的方形结构元素,用于对分割结果形态学滤波。原视频、近似中值滤波后的视频以及采用形态学滤波后的视频如图3.3.1—1所示

图3.3.1—1原视频、近似中值滤波后的视频以及采用形态学滤波后的结果

videoObj = VideoReader('gyz.avi');

本程序使用了VideoReader函数, 该函数用于读取视频文件对象。

函数调用格式:

obj = VideoReader(filename)

obj = VideoReader(filename,Name,Value)

其中obj为结构体,包括如下成员:

Name - 视频文件名

Path - 视频文件路径

Duration - 视频的总时长(秒)

FrameRate - 视频帧速(帧/秒)

NumberOfFrames - 视频的总帧数

Height - 视频帧的高度

Width - 视频帧的宽度

se = strel('square',3);

本程序通过创建方形结构元素,用于对分割结果形态学滤波。

pixInc = find(Idiff > 0);

    fmed(pixInc) = fmed(pixInc) + beta;

    pixDec = find(Idiff < 0);

    fmed(pixDec) = fmed(pixDec) - beta;

背景差分法别名背景减法,背景差分法的原理是将当前的图像与背景图像进行差分来得到目标区域,这种方法能很好的识别和提取运动目标,是目前运动分割中最常用的一种方法。但是需要构建一幅背景图像,这幅背景图像必须不含要检测的目标或其他不需要检测目标,并且应该能不断的更新来分辨当前背景的变化。

运用阈值法原理进行分割,阈值法是比较简单的图像分割方法,是一种常常运用的并行区域的技术。阈值是用运在区分目标图片和背景图片的灰度门限。如果要检测的图像只有目标和背景两类,那么只需要选取一个阈值这种方法称为单阈值分割,这种方法是将图像中每个像素中的灰度值与阈值相对比,灰度值大于阈值的算一种,灰度值小于阈值的为另一种。如果图像中存在多个检测目标或无关目标,那么就选多个阈值将每个目标及背景区分开,这种方法称为多阈值分割阈值,由于本人只有一个目标则采用单阈值分割。

fg2 = imopen(fg,se);

   fg2 = imclose(fg2,se);  

   对分割结果进行形态学滤波先进行了开操作,再进行闭操作。开操作是一般使对象的轮廓变得光滑,断开狭窄的间断和消除细的突出物。闭操作可使轮廓线更光滑,但与开操作相反的是,闭操作通常消弥狭窄的间断和长细的鸿沟,消除小的空洞,并填补轮廓线中的断裂。

  3.3.2用bwlabel函数对连通域进行标号,并得到最大连通域

[L,num]=bwlabel(fg2,4);%对连通域进行标记,num=6  

Bwlabel函数的用法:L = bwlabel(BW,n)

[L,num] = bwlabel(BW,n),这里num返回的就是BW中连通区域的个数。

返回一个和BW大小相同的L矩阵,包含了标记了BW中每个连通区域的类别标签,这些标签的值为1、2、num(连通区域的个数)。n的值为4或8,表示是按4连通寻找区域,还是8连通寻找,默认为8。本程序使用的是4连通。

四连通或八连通是图像处理里的基本感念:8连通,是说一个像素,如果和其他像素在上、下、左、右、左上角、左下角、右上角或右下角连接着,则认为他们是联通的;4连通是指,如果像素的位置在其他像素相邻的上、下、左或右,则认为他们是连接着的,连通的,在左上角、左下角、右上角或右下角连接,则不认为他们连通。

all = [ img_reg.Area];%求出6个连通域的像素个数

   [d,ind]=max(all);%得到面积最大的连通域

本段bwlabel函数是对连通域进行标号,标完号后利用“Area”属性的参数找到面积最大的连通域,这个连通域即为视频中的人。

3.3.3根据regionprops函数的boundingbox和orientation的阈值分别检测视频中人体的站姿和躺卧两种姿势

or = [img_reg.Orientation];

函数regionprops语法规则为:STATS = regionprops(L,properties)

该函数用来测量标注矩阵L中每一个标注区域的一系列属性。

L中不同的正整数元素对应不同的区域,例如:L中等于整数1的元素对应区域1;L中等于整数2的元素对应区域2;以此类推。

返回值STATS是一个 长度为max(L(:))的结构数组,结构数组的相应域定义了每一个区域相应属性下的度量。Properties可以是由逗号分割的字符串列表、包含字符 串的单元数组、单个字符串'all'或者'basic'。如果properties等于字符串'all',则表4.1中的度量数据都将被计算;如果properties等于字符串'basic',则属性:'Area','Centroid'和'BoundingBox'将被计算。

bo = cat(1,img_reg.BoundingBox);

cat:用来联结数组

用法:C = cat(dim, A, B)         按dim来联结A和B两个数组。

  C = cat(dim, A1, A2, A3, ...)    按dim联结所有输入的数组。

Boundingbox用来表示包含相应区域的最小矩形,它有四个参数分别为[x,y,width,height]。

根据regionprops函数的boundingbox和orientation的参数,我们可以获得每一帧的图像的长宽比和方向角的参数。然后跟据这些数据来判断人体站立和躺卧来设置长宽比和方向角的范围,通过多次比对与测试,我认为站立的方向角从81~89,躺卧的方向角从-3~6,站立的长宽比从1.7~3躺卧的长宽比0.2~0.5是比较合适的。

     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

    

       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  

本程序采用循环语句来判断图像每一帧的人体姿态,根据该帧图像的参数判断该参数处在哪一个的范围内,就可以在图像上方显示此时人体正处于的姿态,从而达到预期的效果,

下面的图片就是采用统一的参考视频根据所编的程序进行人体检测后所得到的结果。

在输出的图像中可以看到人体在站立时,视频的上方会出现“站立”的文字,如下图3.3.3—1 所示

图3.3.3—1对站立姿势的判断

在躺卧时,视频的上方会出现“躺卧”的文字,如下图3.3—2 所示

图3.3—2对躺卧姿势的判断

在不是站立和躺卧时,视频的上方会出现“其他”的文字,如下图3.3—3 所示

图3.3.3—3对其他姿势的的判断

3.4程序调试

对编写的软件程序,以测试视频为例进行调试,根据结果,再使用另一个视频进行测试,并完善程序功能。

新视频中检测人体站立姿态的检测结果,如图3.4-1所示

图3.4-1对站立姿势的判断

新视频中检测人体躺卧姿态的检测结果,如图3.4-2所示

图3.4-2对躺卧姿势的判断

新视频中检测人体其它姿态的检测结果,如图3.4-3所示

图3.4-3对其他姿势的的判断

通过比对,新视频的结果基本上达到了预期的效果,说明本次设计的程序可以实现对人体姿态的站姿与躺卧姿态的检测。

参考文献

[1] 罗万盈.基于单目视觉的人体运动姿态捕捉研究与实现[D].北京交通大学,2015.

[2] 陈硕. 基于视频序列的人体姿态检测与估计系统[D].东南大学,2012..

[3] 杨丹, 赵海滨, 龙哲等.MATLAB图像处理实例详解 [M].清华大学出版社, 2013.

[4] Nehmer, J., Becker, M., Karshmer, A., Lamm, R. Living assistance systems-an ambient intelligence approach[C]// The 28th International Conference on Software Engineering, ACM, USA, New York, 2006: 43–50.

[5] 孔晓东.智能视频监控技术研究[D].上海:上海交通大学,2008.

[6] [美]Richard O.Duda, 模式分类[M].北京:机械工业出版社,2003.

[7] 冈萨雷斯.数字图像处理(MATLAB)中文版[M].北京:电子工业出版社,2007

[8] 常好丽.运动行人检测与跟踪方法研究[D] .陕西:西北工业大学,2006.

[9] 章毓晋.图像分割[M].北京: 科学出版社, 2001.

[10]Kentaro Toyama,et,al Wallflower: Principles and Practice of Background Maintenance. International Conference on Computer Vision, September 1999, Corfu, Greece.

附录1

% 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);

ors_low=82;

ors_high=89;

ori_high=6;

ori_low=-3;

bo_t1=0.5;

bo_t2=0.2;

bo_z1=1.7;

bo_z2=3;

%创建方形结构元素,用于对分割结果形态学滤波

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

    %对分割结果进行形态学滤波

    fg2 = imopen(fg,se);

    fg2 = imclose(fg2,se);

    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

     

    bo = cat(1,img_reg.BoundingBox);

    ratio(n)= bo(ind,4)/bo(ind,3);

     %对每一帧图像的长宽比进行判断姿态

     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

附录2文章来源地址https://www.toymoban.com/news/detail-821023.html

到了这里,关于基于视频的人体姿态检测的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于目标检测、跟踪 的人体姿态估计 算法进行跌倒检测 ---- fall detection

    前序文章: 深度学习与视频分析简介 视频分析:基于目标检测(YOLO)实现走路看手机检测、玩手机检测、跌倒检测等 基于深度学习算法的行为识别解决方案:打电话、玩手机、摔倒等行为动作的识别,跟踪

    2024年02月09日
    浏览(32)
  • 深度学习之基于Yolov5人体姿态摔倒识别分析报警系统(GUI界面)

    欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。   系统设计概述: 传感器采集:通过在场景中布置摄像头或红外传感器等设备,采集人体姿态数据,包括人体位置、姿态、运动轨迹等信息。 数据预处理:对采集到的数据进行预处理,包括图

    2024年02月05日
    浏览(21)
  • 基于python使用OpenCV和MediaPipe通过人体姿态检测实现对标准的仰卧起坐数量的计量(三)

    先来看一下main.py的代码 import cv2 import numpy as np import PoseModule as pm   cap = cv2.VideoCapture(\\\'10.mp4\\\') detector = pm.poseDetector() count = 0 dir = 0   while True:     success, img = cap.read()     img = cv2.resize(img, (400, 300))     img = detector.findPose(img, False)     lmList = detector.fi

    2024年04月16日
    浏览(38)
  • facenet, dlib人脸识别,人体检测,云数据库mysql,QQ邮箱,手机验证码,语音播报

    目录 部分代码展示:  录入部分 识别部分​编辑  活体检测部分​编辑  同步到云数据库MySQL  其他操作 部分图片展示: 完整代码加ui链接: 涉及到的一些知识点的文章  活体检测超过三次的人员禁止识别(后面可通过管理员接触) 管理员登录和人脸录入需要手机验证码,

    2024年02月08日
    浏览(35)
  • 人体姿态识别方案详解

    目前AR,VR,元宇宙都比较火,需要实际场景和虚拟中进行交互的情况,因此研究了通过摄像头获取图像进行识别,本文主要概述了在人体身体姿势识别跟踪方面的一些调研和尝试。 通过各个方案,我们可以从RGB视频帧中推断出整个身体的关键特征点,从而根据这些关键特征

    2023年04月09日
    浏览(34)
  • Python Opencv实践 - 人体姿态检测

            本文仍然使用mediapipe做练手项目,封装一个PoseDetector类用作基础姿态检测类。         mediapipe中人体姿态检测的结果和手部跟踪检测的结果是类似的,都是输出一些定位点,各个定位点的id和对应人体的位置如下图所示:         关于mediapipe的pose解决方案类更详细

    2024年02月03日
    浏览(27)
  • MediaPipe人体姿态、手指关键点检测

    Mediapipe是google的一个开源项目,用于构建机器学习管道 提供了16个预训练模型的案例:人脸检测、Face Mesh、虹膜、手、姿态、人体、人物分割、头发分割、目标检测、Box Tracking、Instant Motion Tracking、3D目标检测、特征匹配、AutoFlip、MediaSequence、YouTube-8M 肢体识别本质上还是分类

    2024年02月08日
    浏览(28)
  • 人体姿态检测 通过Opencv+Openpose实现

    通过一个偶然机会,我了解到了人体姿态解算,在学习K210之余,我便想着通过opencv实现这个功能,查找了很多资料,发现可以利用opencv+openpose实现,接着我又开始找一些资料,在pycharm上部署。 人体姿态估计的一个有趣应用是 CGI(computer graphic image,一种电影制造技术)应用

    2024年02月08日
    浏览(46)
  • Python+OpenCV+OpenPose实现人体姿态估计(人体关键点检测)

    1、人体姿态估计简介 2、人体姿态估计数据集 3、OpenPose库 4、实现原理 5、实现神经网络 6、实现代码 人体姿态估计(Human Posture Estimation),是通过将图片中已检测到的人体关键点正确的联系起来,从而估计人体姿态。 人体关键点通常对应人体上有一定自由度的关节,比如颈、

    2024年02月04日
    浏览(19)
  • MMPose姿态估计+人体关键点识别效果演示

    1.1 背景 首先姿态估计属于计算机视觉领域的一个基础研究方向。MMPose是基于Pytorch的姿态估计开源算法库,功能全,涵盖的算法多。 1.2 姿态估计的任务分类 维度 :预测的是2D还是3D姿态。 输入格式 :图片 or 视频 姿态的表示形式 :关键点 or 形状等 目标类型 :全身 or 人脸

    2024年01月20日
    浏览(22)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包