Kinect 动作识别组件概要设计

这是数年前在一个公司做的;Kinect手势识别的一个DLL,供其他应用开发调用。

这是概要设计文档。可以了解Kinect技术,以及作为文档写作的参考。代码恕不能提供。

 

Kinect 动 作 识 别 组 件 概 要 设 计

目录
一. 设计背景与设计目的    1

1. 设计背景    1

2. 设计目的    1

3. 参考资料    1

二. Kinect技术概述    1

三.系统的性能与可靠性设计    1

四.系统运行环境    2

五.需要识别的身体动作和手势汇总    2

六. 动作和手势识别算法设计概述    2

七.动作和手势识别算法具体设计    3

<一>.身体动作识别    3

<二>. 手势识别    4

八. 类设计    6

九. 接口设计    8

十. 异常情况处理    8


一. 设计背景与设计目的


1. 设计背景
体感技术是通过“传感器”或者“视觉设备”对“人的动作”进行捕捉,根据捕捉到的动作来 “控制应用程序”的技术。
体感技术应用广泛,例如三维演示,游戏操控,机械控制,健康医疗,运动监测,全息影像等。

2. 设计目的
设计一个基于微软体感技术(Kinect)的动作识别工具包,包装为动态链接库。该工具包既可以在公司内部的项目中使用,也可以单独作为一个产品在市场上销售。
该工具包完成后,可以识别出各种身体动作和手势,不同的动作和手势会产生相应的事件,在应用程序中检测到相应的事件后进行不同的处理,从而实现用手势和动作来控制应用程序。
3. 参考资料
Windows Kinect SDK文档和示例;
Kinect应用开发实战-用最自然的方式与机器对话,机械工业出版社,余涛著。

二. Kinect技术概述


Kinect传感器会产生三种数据流,彩色影像数据,深度数据,骨骼数据。本工具包获取其骨骼数据流,然后根据获取到的数据进行计算、比较、判断,来识别出身体的动作和手势。Kinect传感器产生每秒30帧的骨骼数据流。每帧有全身20个关节点的坐标位置,每个关节点有X、Y、Z三个坐标。骨骼空间坐标系以米为单位。

三.系统的性能与可靠性设计


进行动作和手势的判断需要进行一定的计算和比较,每秒30帧数据,在每帧中进行计算和比较,计算和比较要尽量精简,达到好的性能。
该工具包需要被别的应用程序调用,所以要有良好的异常处理机制。产生异常情况,要给调用方相应的提示,调用方可根据提示进行相应处理。

四.系统运行环境


在硬件方面,需要在电脑上连接微软Kinect传感器。
软件方面,该工具包用C#语言开发,所运行系统为Windows XP 以上版本,需要.NET运行时环境的支持,并需要Windows Kinect SDK。

五.需要识别的身体动作和手势汇总


身体动作:身体左倾,身体右倾,身体前倾,身体后倾,左(右)手前伸,左(右)手举起,左(右)手放下,左(右)手向左(右)伸,左(右)手向右(左)伸,左(右)脚往前,左(右)脚往后,左(右)脚抬起,左(右)脚往左(右),跳,走。
手势:推,往上挥,往下挥,往左挥,往右挥;
缩放手势,动作为两手抬起,手高于腕,两手基本保持平行,两手逐步向外打开为放大,逐步向里合拢为缩小;
拖动手势,动作为手朝向屏幕,向各个方向移动;
偏转和旋转手势,动作为左手放到左肩前,右手向各个方向移动。

六. 动作和手势识别算法设计概述


对于单个动作或手势的识别,算法目前有以下几种情况:
1 根据各个关节点的相对位置,或某个或某几个关节点相对于某个参考点的相对位置,进行比较来识别是那种动作或手势,
2 根据一个关节相对于另一个关节移动的距离,或一个关节点相对于某个参考点移动的距离来识别;
3 计算由某三个关节点构成的三角形的某个夹角来识别;
4 统计某个关节点在某个范围内的移动次数来判断;
5 需要定时器来作辅助进行判断;

首先如果用1和2的算法能完全识别出动作和手势,就采用1和2,这样算法简单、代码简洁;
如果识别不出,再考虑3和4,
最后识别不出再考虑5的情况;

七.动作和手势识别算法具体设计


<一>.身体动作识别
1 身体左(右)倾
    以中心肩关节和中心髋关节的X值的差值来判断,大于某个阈值识别为右倾,否则为左倾;
    触发事件后需要抛出的参数:中心肩关节,中心髋关节,中心肩关节X值,中心髋关节X值。

2. 身体前(后)倾
    以中心肩关节和中心髋关节的Z值的差值来判断,大于某个阈值识别为后倾,反之为前倾;
    触发事件后需要抛出的参数:中心肩关节,中心髋关节,中心肩关节Z值,中心髋关节Z值。

3 左(右)手前伸
以肩关节和手关节的Z值的差值来判断,大于某个阈值识别为前伸;
触发事件后需要抛出的参数:左(右)关节,左(右)肩关节,左(右)关节Z值,左(右)肩关节Z值。

4 左(右)手举起
    以手关节和肩关节的Y值的差值来判断,小于某个阈值识别为手举起;
触发事件后需要抛出的参数:左(右)手关节,左(右)肩关节,左(右)手关节Y值,左(右)肩关节Y值。

5 左(右)手放下
    以手关节和肩关节的Y值的差值来判断,大于某个阈值识别为手放下;
触发事件后需要抛出的参数:左(右)手关节,左(右)肩关节,左(右)手关节Y值,左(右)肩关节Y值。

6 左手向右伸,右手向左伸
以手交错过身体到肩膀的距离来判断,左手关节与右肩关节X值小于一定域值,识别为左手向右伸,反之为右手向左伸;
触发事件后需要抛出的参数:左(右)手关节,右(左)肩关节,左(右)手关节X值,右(左)肩关节X值。

7 左手向左伸,右手向右伸
以手到肩膀的距离来判断,左肩关节与左手关节X值的差值大于一定域值,识别为左手向左伸,右手关节与右肩关节X值的差值大于一定域值,识别为右手向右伸;
触发事件后需要抛出的参数:左(右)手关节,左(右)肩关节,左(右)手关节X值,左(右)肩关节X值。

8. 左(右)脚往前
以左(右)脚关节(Foot Left, Foot Right)与脊关节(Spine)的Z值的差值来判断,脊关节与左脚关节Z值的差值大于某个域值,识别为左脚向前伸,反之为右脚向前伸;
触发事件后需要抛出的参数:左(右)脚关节,脊关节,左(右)脚关节Z值,脊关节Z值。

9. 左(右)脚往左(右)
以左(右)脚关节与中心髋关节的X值的差异来识别,中心髋关节与左脚关节的X值的差值大于某个域值识别为左脚往左伸,右脚关节与中心髋关节的X值的差值大于某个域值识别为右脚向右伸;
触发事件后需要抛出的参数:左(右)脚关节,中心髋关节,左(右)脚关节X值,中心髋关节X值。

10. 左(右)脚往后
以左(右)脚关节(Foot Left, Foot Right)与脊关节(Spine)的Z值的差值来判断,左(右)脚关节与脊关节的Z值的差值大于某个域值,识别为左(右)脚往后;
触发事件后需要抛出的参数:左(右)脚关节,脊关节,左(右)脚关节Z值,脊关节Z值。

11. 左(右)脚抬起 
以左和右脚关节Y值的差值来判断,左脚Y值大于右脚Y值超过某个域值识别为左脚抬起,右脚Y值大于左脚Y值超过某个阈值识别为右脚抬起;
触发事件后需要抛出的参数:左脚关节,右脚关节,左脚关节Y值,右脚关节Y值。

12. 跳
以两脚关节同时离开地板的距离来判断,超过某个阈值识别为跳;
触发事件后需要抛出的参数:左脚关节,右脚关节,左脚关节Y值,右脚关节Y值,地板位置。

13. 走
方法一:统计一个脚关节Y值高于另一个脚关节Y值的次数,达到一定的域值次数识别为走;
触发事件后需要抛出的参数:一个脚关节高于另一个脚关节的次数,左脚关节,右脚关节。
方法二:以脊关节移动的距离来判断,大于一定阈值识别为走,脊关节X值减小、增大判走动方向为左、右走动,脊关节Z值减小、增大判走动方向为前、后走动;
触发事件后需要抛出的参数:脊关节,脊关节X值,脊关节Z值,走动方向。

<二>. 手势识别
1. 推手势
探测手势在Z轴负方向的移动距离,大于某个域值识别为检测到推手势。
触发事件后需要抛出的参数:手关节,手关节Z值。

2. 往上挥
探测左(右)手在Y轴方向的移动距离,大于某个域值识别为检测到往上挥;
触发事件后需要抛出的参数:左(右)手关节,左(右)手关节Y值。

3. 往下挥
    探测左(右)手在Y轴负方向的移动距离,大于某个域值识别为检测到往下挥;
触发事件后需要抛出的参数:左(右)手关节,左(右)手关节Y值。

4. 往左挥
探测左手在X轴方向的移动距离,大于某个域值识别为检测到往左挥;
触发事件后需要抛出的参数:左手关节,左手关节X值。

5. 往右挥
探测右手在X轴负方向的移动距离,大于某个域值识别为检测到往右挥;
触发事件后需要抛出的参数:右手关节,右手关节X值。

6. 画圈
以左(右)手的肘关节为中心,连续检测五个点:第一点 - 手关节Y值大于肘关节Y值一定值且手关节X值与肘关节X值的差值小于一个很小的值,第二点 -手关节Y值与肘关节Y值的差值小于一个很小的值且手关节X值大于肘关节X值一定值,第三点 – 手关节Y值小于肘关节Y值一定值且手关节X值与肘关节X值的差值小于一个很小的值,第四点 -手关节Y值与肘关节Y值的差值小于一个很小的值且手关节X值小于肘关节X值一定值,第五点 – 即第一个点;
连续检测到此五个点,则识别为左(右)手画圈;
触发事件后需要抛出的参数:五个点时手和肘关节的X和Y坐标,共10个值。

7. 左(右)手挥手
以左(右)手的肘关节为中心,统计手关节在肘关节附件来回移动的次数,达到一定次数时识别为挥左(右)手;
触发事件后需要抛出的参数:左(右)手关节,左(右)肘关节,来回移动次数。

8. 缩放手势
左右手关节均高于左右腕关节,左右手关节均低于左右肩关节,识别为缩放手势;
触发事件后需要抛出的参数:左手关节,右手关节,左手关节X值,右手关节X值。

9. 拖动手势
检测到右手移动,且右手关节和右腕关节的差值小于一定值,则判为拖动;
触发事件后需要抛出的参数:右手关节,右腕关节,右手关节X值。

10. 旋转和偏转手势
计算左手关节和左肩关节的X、Y、Z坐标的差值,如果均小于一定域值,则识别为旋转和偏转;
触发事件后需要抛出的参数:左手关节,左肩关节,右手关节,右手关节X值,右手关节Y值。

八. 类设计


身体动作识别和其抛出的事件封装为一个类ActionRecognize,手势识别和其抛出的事件封装为一个类GestureRecognize,事件参数封装为一个类RecognizeEventArg,所用到的计算作为帮助类封装为一个类KinectHelper。

 

 

九. 接口设计


此处主要是外部的调用接口。在调用程序中注册本DLL的事件,然后检测手动作或手势对应的事件,等同于识别到相应的手势,然后就可以根据自己的需要进行自己的处理,还可以根据事件所传递的参数做一些更细致的处理。事件所传递的参数,是一到数个关节,和关节的具体的某个X或Y或Z坐标,以及其他一些必要的数值,还需要说明关节的数量和类型。所以在事件参数中需要传递:关节数量,关节类型数组,关节数组,关节的具体X、Y、Z值,一些必要的数值。

十. 异常情况处理


    Kinect传感器设备的连接或未连接等情况,以及Kinect传感器的设备状态,由调用方自行处理。其他异常通过事件参数传递该调用方。
 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值