这是数年前在一个公司做的;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传感器的设备状态,由调用方自行处理。其他异常通过事件参数传递该调用方。

Kinect 动作识别组件概要设计相关推荐

  1. 基于kinect的人体动作识别系统

    基于kinect的人体动作识别系统(算法和代码都放出) 首先声明一下,本系统所使用的开发环境版本是计算机系统Windows 10.Visual Studio 2013.Opencv3.0和Kinect ...

  2. 基于kinect的人体动作识别系统(算法和代码都放出)

    基于kinect的人体动作识别系统(算法和代码都放出) 首先声明一下,本系统所使用的开发环境版本是计算机系统Windows 10.Visual Studio 2013.Opencv3.0和Kinect ...

  3. java kinect 人体识别_基于kinect的人体动作识别系统

    [实例简介] 基于kinect v2的人体动作识别,配套博客(http://blog.csdn.net/baolinq/article/),基于mfc,可以识别左移右移.上蹦下跳等,也可以自己自定义其 ...

  4. 基于骨架动作识别的时空图卷积网络

    论文来自https://arxiv.org/abs/1801.07455 英语渣渣的阅读和翻译 基于骨架动作识别的时空图卷积网络 摘要:人体骨骼动力学为人类动作识别传达了重要信息.传统方法在骨骼建模上 ...

  5. Action4D:人群和杂物中的在线动作识别:CVPR209论文阅读

    Action4D:人群和杂物中的在线动作识别:CVPR209论文阅读 Action4D: Online Action Recognition in the Crowd and Clutter 论文链接 ...

  6. 图卷积网络进行骨骼识别代码_深兰科学院:动作识别——人体骨架时空图卷积网络的关节图构造方法简介...

    港中文团队论文的主要内容 1 Introduction 近年来,人类动作识别已成为活跃的研究领域,因为它在视频理解中起着重要作用.一般而言,人类行为可以从多种形式中识别,例如外观.深度. 光流和人体骨 ...

  7. CVPR 2022 Oral|港中文开源PoseC3D:基于3D-CNN的骨骼动作识别框架

    编辑丨极市平台 作者丨Kenny@知乎 来源丨https://zhuanlan.zhihu.com/p/493374779 Paper:https://arxiv.org/abs/2104.13586 ...

  8. 基于3D关节点的人体动作识别综述(转)

    原文:2016,Pattern Recognition: 3D skeleton-based human action classification: A survey 摘要 近年来,基于深度序列的人 ...

  9. 论文翻译:混合维在庞加莱几何三维骨架的动作识别

    Graph Convolutional Networks (GCNs)已经展示了其对不规则数据(如人体动作识别中的骨骼数据)建模的强大能力,这提供了一种令人兴奋的新方法,为居住在图中不同部分的节点融合 ...

最新文章

  1. DB天气app冲刺二阶段第十一天(完结)
  2. Spark记录-Scala语法基础
  3. java catch中 return_JAVA中try、catch、finally带return的执行顺序总结
  4. 四种常见 Git 工作流比较
  5. Docker安装QuestDB教程
  6. 内存分配失败错误处理
  7. BenchmarkSQL 测试Oracle 12c TPC-C 性能
  8. 数字信号处理技术(二)变分模态分解(VMD)-Python代码
  9. java获取.py文件值_Java File文件处理 读文件
  10. Hexo博客之速度优化
  11. Shawn Wildermuth的《Architecting WP7 》系列文章
  12. laravel 房源
  13. 使用piranha搭建高可用LVS集群
  14. 好听的敕勒川天苍苍野茫茫风吹草低见牛羊
  15. 被装管理系统之出入库流程
  16. Excel如何将行高列宽等格式设置一并全复制?
  17. python 安装CV2
  18. 怎么把文字转换成语音,这里有简单的方法
  19. k8s 集群部署(dashboard+metrics-server)
  20. 【C语言】memcmp、memcpy、memmove、memset、memchr函数详解

热门文章

  1. 如何新增或修改ns2的核心模組--queue management
  2. 模式扩展 ——简单工厂+配置文件解除耦合 *****
  3. java.awt.Graphics2D绘制流程图基本元素
  4. Windows 技术篇-桌面图标全部消失问题解决方法,windows资源管理器重启实例演示
  5. MySql8.0.19最新版本创建用户分配权限演示,You have an error in your SQL syntax权限分配问题解决方法
  6. Excel 技术篇-解决“单元格不能自动适应大小“问题
  7. C++ leetCode 1. 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个
  8. 判断是否是2的N次方
  9. 工程师必看-PCB设计标准工艺要求(五)
  10. matlab滤波仿真