基于kinect的人体动作识别系统
基于kinect的人体动作识别系统(算法和代码都放出)
首先声明一下,本系统所使用的开发环境版本是计算机系统Windows 10、Visual Studio 2013、Opencv3.0和Kinect SDK v2.0。这些都可以在百度上找到,download下来安装一下即可。
关于kinect的环境配置以及骨骼数据获取等等等问题,参考我之前kinect系列的博客(http://blog.csdn.net/baolinq/article/details/52373574)。
完整工程代码在GitHub(https://github.com/baolinhu/kinect-gesture),想看的可以去看看,顺便点个star~~~
一、人体姿态特征提取
1.1关节点相对距离系数计算
由于CSDN的编辑页面对公式的支持太不友好了,我只能使用截图了~~
二、人体动作识别的核心算法
根据已获取到的数据源即可对人体动作进行准确识别。这里我使用比较简单但通用的方法,因为kinect可以直接获取人体的三维坐标,根据人体三维坐标的相对位置关系即可对人体的动作和形态进行准确判断和识别。
下面给出算法流程图。因为懒的去画图,直接用手在纸上画的,字chou图也chou,将就着看看吧~~~
图5-1 系统的核心算法流程图
由流程图可知,人体动作别系统在工作时,主要通过人体的骨骼数据来判断是何种行为,利用骨骼点之间的距离关系和夹角关系。本系统只考虑单个目标人体的单种简单行为,不考虑多目标多动作的情况。首先,判断重心的位置变化,一般就是上下左右变化,如果重心有左移,且距离超过给定阈值,就认为目标人体有左移行为,同样的,如果重心有右移,且距离超过给定阈值,就认为目标人体有右移行为。如果重心没有移动,那就肯定没有左移和右移行为。对于下蹲的检测,从定义的角度看,就是腿部有弯曲。本系统也是主要检测腿部是否有弯曲到一定程度,判断臀部、膝盖、脚踝三点连线的夹角是否小于160度(经验值),如果小于,那就是有下蹲,因为正常情况下,三点之间夹角近似为180度。或者检测臀部、膝盖、脚踝三点之间的2段距离之和大于臀部到膝盖之间的直接距离的1.15倍,也认为是有下蹲行为。最后是上绷的检测,上蹦从定义看,就是双脚离开地面,人体有向上的一小段运动。本系统是通过检测双脚是否离开地面超过给定阈值,或者人体重心相比正常站立时上升距离超过给定阈值,就认为有上蹦行为。所有的动作识别都是实时的,结果都会实时输出。
部分核心代码:完整代码文末会给出完整下载链接
- //检测函数:为了检测准确请尽量站在合适位置,让Kinect获取全身骨骼点
- void CBodyBasics::Detection(Joint joints[])
- {
- static double tin, tout;
- //double tframe;
- CMFC_DEMO01Dlg *pDlg0 = CMFC_DEMO01Dlg::s_pDlg; //实例化一个CMFC_DEMO01Dlg 指针
- //计算每相邻10帧的高度差,从而计算速度,1,11,12,22
- //大概30帧每秒,那么10帧就是0.33秒,
- if (framenumber % 11 == 1) //framenumber是帧序列号,自己定义的
- {
- tin = static_cast<double>(GetTickCount());
- //cout << "tin是" << tin << endl;
- spinemid_xin = joints[JointType_SpineMid].Position.X;
- spinemid_yin = joints[JointType_SpineMid].Position.Y;
- rightfoot_yin = joints[JointType_KneeRight].Position.Y;
- leftfoot_yin = joints[JointType_KneeLeft].Position.Y;
- spinebase_yin = joints[JointType_SpineBase].Position.Y;
- rightAnkle_yin = joints[JointType_AnkleRight].Position.Y;
- base_foot_in = spinebase_yin - rightAnkle_yin;
- //cout << "basefootin为:" << base_foot_in << endl;
- //cout << "当前SpineHeightin的高度为" << SpineHeightin << " m"<<endl;
- }
- if (!(framenumber % 11))
- {
- tout = static_cast<double>(GetTickCount());
- //cout << frmamenumber << endl;
- //cout <<"tout是"<< tout << endl;
- //cout << "每10帧计算一次下降的速度" << endl;
- spinemid_xout = joints[JointType_SpineMid].Position.X;
- spinemid_yout = joints[JointType_SpineMid].Position.Y;
- rightfoot_yout = joints[JointType_KneeRight].Position.Y;
- leftfoot_yout = joints[JointType_KneeLeft].Position.Y;
- rightAnkle_yout = joints[JointType_AnkleRight].Position.Y;
- spinebase_yout = joints[JointType_SpineBase].Position.Y;
- base_foot_out = spinebase_yout - rightAnkle_yout;
- //cout << "当前帧号为:" << base_foot_out << endl;
- // cout << "***********************************" << endl;
- // cout << "当前SpineHeightin的高度为" << SpineHeightin << " m" << endl;
- //tframe = (tout - tin) / getTickFrequency();
- // cout <<tframe << endl;
- // cout << getTickFrequency()<<endl;
- //cout << "当前SpineHeightout的高度为" << SpineHeightout << " m" << endl;
- //SpineV = (SpineHeightin - SpineHeightout) / tframe;
- spinemid_x = spinemid_xout - spinemid_xin;
- spinemid_y = spinemid_yout - spinemid_yin;
- rightfoot_y = rightfoot_yout - rightfoot_yin;
- leftfoot_y = leftfoot_yout - leftfoot_yin;
- base_foot = base_foot_out - base_foot_in;
- //cout << "Spinemid_x是多少??" << base_foot << endl;
- //cout << "Spinemid_y是多少??" << spinemid_y << endl;
- //上蹦检测:双脚离地面超过0.15米,或者人体重心相对正常站立时上升超过0.15米
- if ((leftfoot_y>0.15&&rightfoot_y > 0.15) || (spinetemp>0.01&&spinetemp + 0.15<joints[JointType_SpineMid].Position.Y)) //y轴向上为正
- {
- string str1 = "上蹦\r\n " ; //这里面是为了把数据输出到mfc显示框,你可以不用管,下同
- CString cstr = str1.c_str(); //删掉编辑框中的内容,方法一:GetDlgItem(IDC_EDIT1)->SetWindowText("");
- //方法二:给编辑框定义一个控件变量,m_edit1.SetWindowText("");
- pDlg0->m_outedit.SetSel(-1);
- pDlg0->m_outedit.ReplaceSel(cstr);
- cout << str1; //控制台输出显示,下同。为了方便调试,这里同时会显示到控制台
- }
- //else if (base_foot < -thresh_y) //下蹲检测:主要检测腿部有弯曲即可,臀部与脚踝之间的距离减少超过0.2米
- else if (Distance(joints[JointType_HipLeft], joints[JointType_AnkleLeft])*(1 + 0.15) < Distance(joints[JointType_HipLeft], joints[JointType_KneeLeft]) + Distance(joints[JointType_KneeLeft], joints[JointType_AnkleLeft]))
- {
- flag++;
- if (flag == 2) //下蹲状态需要时间,这里给了一下标志位,类似计时器,连续监测到两次才算下蹲,避免重复出现结果
- {
- flag = 0;
- //下蹲其他检测方法,还可以检测hipleft、knee、ankle三点之间的夹角关系和距离关系,夹角小于160度(可以多试几
- //个值),说明有下蹲,或者两边之和大于第三边的1.15倍左右,也可以说明有下蹲
- string str1 = "下蹲\r\n ";
- CString cstr = str1.c_str();
- pDlg0->m_outedit.SetSel(-1);
- pDlg0->m_outedit.ReplaceSel(cstr);
- cout << str1;
- }
- }
- //x轴方向向右为正
- //重心向右移动超过阈值thresh_x,则判断右移
- if (spinemid_x > thresh_x)
- {
- string str1 = "右移\r\n ";
- CString cstr = str1.c_str();
- pDlg0->m_outedit.SetSel(-1);
- pDlg0->m_outedit.ReplaceSel(cstr);
- cout << str1;
- }
- else if (spinemid_x < -thresh_x) 重心向左移动超过阈值thresh_x,则判断左移
- {
- string str1 = "左移\r\n ";
- CString cstr = str1.c_str();
- pDlg0->m_outedit.SetSel(-1);
- pDlg0->m_outedit.ReplaceSel(cstr);
- cout << str1;
- }
- }
- //根据勾股定理,计算HipLeft、AnkleLeft、AnkleLeft之间的距离关系。0.15是一个估计值,可根据实际情况略微调整
- /* if (Distance(joints[JointType_HipLeft], joints[JointType_AnkleLeft])*(1 + 0.15) < Distance(joints[JointType_HipLeft], joints[JointType_KneeLeft]) + Distance(joints[JointType_KneeLeft], joints[JointType_AnkleLeft]))
- {
- flag++;
- if (flag == 2) //下蹲状态需要时间,这里给了一下标志位,类似计时器,连续监测到两次才算下蹲,避免重复出现结果
- {
- flag = 0;
- cout << "下蹲1111111\n";
- }
- }
- */
- }
总结:虽然整个对人体动作识别系统很简单,但是还是有一定的引导和启发作用的,对人体动作的准确识别已被广泛地应用在人机交互[1]、智能监控[2]、机器人自主导航[3]、动画游戏和医疗康复等领域中,有很大的意义,有兴趣的同学可以继续做更加深入的研究。
参考文献:
[15] 余涛.Kinect应用开发实战:用最自然的方式与机器人对话.北京:机械工业出版社,2012.1-337.
[16] 樊景超,周国民.基于Kinect骨骼追踪技术的手势识别研究.安徽农业科学,2014,42(11):3444-3446.
[17] 谢亮,廖宏建,杨玉宝.基于Kinect 的姿态识别与应用研究.计算机技术与发展,2005,23(5):258-260.
[18] 战荫伟,于芝枝,蔡俊.基于Kinect 角度测量的姿势识别算法.传感器与微系统,2014,33(7):129-132.
[19] 刘开余, 夏斌. 基于Kinect的实时人体姿势识别[J]. 电子设计工程, 2014(19):31-34.
系列博客网址:
第一篇 基于Kinect v2的跌到检测系统的概述
http://blog.csdn.net/baolinq/article/details/52356863
第二篇 KinectV2结合opencv入门开发以及一些相关的学习资料
http://blog.csdn.net/baolinq/article/details/52356947
第三篇 KinectV2骨骼获取原理和获取方法及源代码
http://blog.csdn.net/baolinq/article/details/52373574
第四章 利用Kinect抠图和自动拍照程序
http://blog.csdn.net/baolinq/article/details/52388095
第五章 跌倒检测算法剖析
http://blog.csdn.net/baolinq/article/details/52400040
第六章 KinectV2结合MFC显示和处理图像数据(上)
http://blog.csdn.net/baolinq/article/details/52401116
第七章 KinectV2结合MFC显示和处理图像数据(下)
http://blog.csdn.net/baolinq/article/details/52422206
第八章 基于Kinectv2跌倒检测系统的总结
http://blog.csdn.net/baolinq/article/details/52440447
好了,本篇文章到这里就要结束了。本篇文章主要介绍了借助kinect来准确识别人体动作,大家可以发挥自己的想象力,自定义更多的动作,应用在更广泛的场景。下面附上更加完整和规范的源码下载网址,1积分下载(因为貌似不能0积分上传资源了,尴尬~)。
http://download.csdn.net/download/baolinq/10003879
下一篇见。
超跑开起来~~
基于kinect的人体动作识别系统相关推荐
- 基于kinect的人体动作识别系统(算法和代码都放出)
基于kinect的人体动作识别系统(算法和代码都放出) 首先声明一下,本系统所使用的开发环境版本是计算机系统Windows 10.Visual Studio 2013.Opencv3.0和Kinect ...
- java kinect 人体识别_基于kinect的人体动作识别系统
[实例简介] 基于kinect v2的人体动作识别,配套博客(http://blog.csdn.net/baolinq/article/),基于mfc,可以识别左移右移.上蹦下跳等,也可以自己自定义其 ...
- 基于3D关节点的人体动作识别综述(转)
原文:2016,Pattern Recognition: 3D skeleton-based human action classification: A survey 摘要 近年来,基于深度序列的人 ...
- 基于Detectron2和LSTM的人体动作识别
人体动作识别通过分析视频来预测或分类视频中人物的各种动作.它被广泛应用于监测.体育.健身.防御等各个领域. 假设你想创建一个在线教授瑜伽的应用程序.它应该提供一个预先录制的瑜伽视频列表供用户观看.用户 ...
- 空间注意力机制sam_一种基于注意力机制的神经网络的人体动作识别方法与流程...
本发明属于计算机视觉领域,具体来说是一种基于注意力机制的神经网络的人体动作识别的方法. 背景技术: 人体动作识别,具有着非常广阔的应用前景,如人机交互,视频监控.视频理解等方面.按目前的主流方法,可主 ...
- 本科毕设论文——基于Kinect的拖拉机防撞系统
基于Kinect的拖拉机防撞系统 电子信息科学与技术专业学生 sukeysun 摘要:随着智能车辆技术的发展,智能导航定位和实时车载监控等技术被更多的应用到日常生活照.在农业领域上,车辆自主感知道路环 ...
- 人体动作识别与评价——区别、联系及研究进展
摘要 人体动作识别与动作评价是近年来的热点研究问题.两者在数据类型.数据处理.特征描述等方面有许多相通之处.近年来,随着应用需求的显著增长,出现了大量有关动作识别与评价的研究工作,但两者间的区别与联系 ...
- 基于动态骨骼的动作识别方法ST-GCN
解读:基于动态骨骼的动作识别方法ST-GCN(时空图卷积网络模型) 2018年04月09日 01:14:14 我是婉君的 阅读数 16076更多 分类专栏: 计算机视觉 论文 版权声明:本文为博主原创 ...
- 使用OpenVINO实现人体动作识别
Paula Ramos著 张晶 译 目录 1.1 人体动作识别背景简介 1.2 OpenVINOTM Notebook简介 1.3 动作识别模型简介 1.4 实现实时动作识别 1.4.1 下载模型 ...
最新文章
- UVa 1339,紫书P73,词频
- 日常总结:自学操作系统基础的一些领悟
- Electron是个啥?
- linux安装静默安装was7,WAS7.0 - 安装并升级WAS7.0.0.31(静默安装)
- leetcode1070. 产品销售分析 III(SQL)
- Redis学习总结(23)——Redis如何实现故障自动恢复?浅析哨兵的工作原理
- 华为P40或将搭载鸿蒙,华为P40或将在明年3月发布,很有可能是首部搭载鸿蒙的手机...
- linux禁止root用户远程登录,linux禁止root用户远程登录
- 2014小米校园招聘笔试(10.13北京)
- 深度linux 安装qq游戏,在Deepin系统下用Playonlinux完全可以运行QQ游戏大厅
- 案例式c语言实验答案,C语言课后实验设计答案
- 《Python语言程序设计基础》嵩天著-第5章程序全练习题答案
- 乘幂法求矩阵的特征值及特征向量
- Python笔记4:控制流
- 东华大学计算机学院推免名单,东华大学2020年接收推荐免试攻读硕士研究生预申请公告...
- 团队的英文翻译缩写_团队的英语是什么?简写呢?
- 下列哪种软件不能编辑html语言,强国挑战答题答案:下面哪种语言最适合用来编写网页中嵌入运行的应用程序?()...
- 数据库连接池使用场景,工作原理和实现步骤
- 燕云台的滑铁卢——豆瓣的营销推广价值
- Android高手进阶教程(一)-------Android常用名令集锦(图文并茂)!
热门文章
- 使用IDEA写程序时,运行忽然报错,提示:在类*** 中找不到 main 方法, 请将 main 方法定义为: public static void main(String[] args)
- 软件语音验证码webservice_明明发送了却迟迟收不到短信验证码?
- win 连续截图功能(PSR 屏幕录制)
- 【机器学习基础】样本类别不平衡的解决办法
- python:兔子繁殖问题
- 基于Halcon学习的车牌识别【一】
- 移动、电信光猫超级管理员密码
- GuzzleHttp使用
- Java exception was raised during method invocation
- 计算机类软件工程与测绘类遥感专业的薪水,2018遥感科学与技术专业就业前景和就业方向分析...