博客
关于我
体感Kinect手势识别开发基本原理
阅读量:100 次
发布时间:2019-02-26

本文共 3857 字,大约阅读时间需要 12 分钟。

下述代码摘自Kinect SDK 自带例子;KinectImageView;

先安装Kinect传感器,开发包,搭建环境;网上有;

新建WPF或C#项目;一般使用WPF;用Winform有时候会有些问题;

引用Kinect命名空间;

using Microsoft.Kinect;

private KinectSensor kinectDevice;

定义一个变量,KinectSensor代表传感器对象;

初始化;

if (this.kinectDevice.Status == KinectStatus.Connected)
{
this.kinectDevice.SkeletonStream.Enable();
this.kinectDevice.ColorStream.Enable();
this.kinectDevice.Start();
this.KinectDevice.SkeletonFrameReady += KinectDevice_SkeletonFrameReady;
}

KinectStatus,传感器状态枚举;

this.kinectDevice.SkeletonStream.Enable(),使能骨骼跟踪;
this.kinectDevice.Start();启动传感器;
this.KinectDevice.SkeletonFrameReady += KinectDevice_SkeletonFrameReady; 骨骼帧准备好事件;

Kinect的帧率为30帧/秒;Kinect传感器的识别范围为传感器前方大体数米范围的一个立体空间;此空间有X、Y、Z坐标;

站在Kinect传感器前,Kinect识别出人体后,如果开发环境都已配置好;
在程序中引入SkeletonFrameReady事件,将会在此事件中收到骨骼帧;每个骨骼帧包含人体各个关节的坐标;
每秒钟会收到30个骨骼帧,SkeletonFrameReady事件每秒自动触发30次;

基本的手势或人体姿态识别代码大体如下;可以识别手的动作,也可以识别身体其他部位的动作;

做开发的时候经常需要站起来做动作,看上去你和办公室其他人很不一样;

private void KinectDevice_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)        {               using (SkeletonFrame frame = e.OpenSkeletonFrame())            {                   if (frame != null)                {                       frame.CopySkeletonDataTo(this.frameSkeletons);                    Skeleton skeleton = GetPrimarySkeleton(this.frameSkeletons);                    if (skeleton != null)                    {                           Joint head = skeleton.Joints[JointType.Head];                        Joint leftHand = skeleton.Joints[JointType.HandLeft];                        Joint leftWrist = skeleton.Joints[JointType.WristLeft];                        Joint rightHand = skeleton.Joints[JointType.HandRight];                        Joint rightWrist = skeleton.Joints[JointType.WristRight];                        Point leftHandPos = GetPosition(leftHand);                        Point leftWristPos = GetPosition(leftWrist);                        Point rightHandPos = GetPosition(rightHand);                        Point rightWristPos = GetPosition(rightWrist);                        if (rightHandPos.Y < rightWristPos.Y && leftHandPos.Y < leftWristPos.Y)                        {                               ......                            if (rightHandTarget != null)                            {                                     ......                            }                            if (leftHandTarget != null && rightHandTarget != null)                            {                                     ......                            }                        }                    }                }            }        }

Skeleton skeleton = GetPrimarySkeleton(this.frameSkeletons);

执行完此句将获取到一个骨骼帧数据;里面包含人体各个关节,关节的坐标;

Joint head = skeleton.Joints[JointType.Head];

获取头关节;

Joint leftHand = skeleton.Joints[JointType.HandLeft];

获取左手关节;

Joint leftWrist = skeleton.Joints[JointType.WristLeft];

获取左腕关节;

Joint代表一个关节;

获取关节中的点坐标;

Point leftHandPos = GetPosition(leftHand);
Point leftWristPos = GetPosition(leftWrist);
Point rightHandPos = GetPosition(rightHand);
Point rightWristPos = GetPosition(rightWrist);

private Point GetPosition(Joint hand)

{
Point p = new Point();
DepthImagePoint point = kinectDevice.MapSkeletonPointToDepth(hand.Position, this.kinectDevice.DepthStream.Format);
p.X = (int)((point.X * LayoutRoot.ActualWidth / kinectDevice.DepthStream.FrameWidth));
p.Y = (int)((point.Y * LayoutRoot.ActualHeight / kinectDevice.DepthStream.FrameHeight));
return p;
}

if (rightHandPos.Y < rightWristPos.Y && leftHandPos.Y < leftWristPos.Y)

通过比较关节点坐标来判断;比如右手的X坐标持续增大,则可判为右手进行了右挥或右移;

最基本的原理就是它传关节坐标给你,你根据关节坐标增大减小判断左移右移等;

如果要识别多一些,更进一步可根据关节坐标计算一些三角函数等;
开发还是有一定难度;因为并不是判断一次x坐标增大或减小,就判断人体关节进行了左移或右移;
要在每秒30帧中持续判断,才能判出姿态;

可能有的用词不太准确;凭记忆写的;

手势识别可以翻阅PPT等;有的场合可能不方便用鼠标或键盘操作电脑,离开屏幕远一些,此时一些简单操作可用手势进行;一般大屏比较适用;

体感有多种用途;见此;
https://blog.csdn.net/bcbobo21cn/article/details/105592485

你可能感兴趣的文章
ndk-cmake
查看>>
NdkBootPicker 使用与安装指南
查看>>
ndk特定版本下载
查看>>
NDK编译错误expected specifier-qualifier-list before...
查看>>
Neat Stuff to Do in List Controls Using Custom Draw
查看>>
Necurs僵尸网络攻击美国金融机构 利用Trickbot银行木马窃取账户信息和欺诈
查看>>
Needle in a haystack: efficient storage of billions of photos 【转】
查看>>
NeHe OpenGL教程 07 纹理过滤、应用光照
查看>>
NeHe OpenGL教程 第四十四课:3D光晕
查看>>
Neighbor2Neighbor 开源项目教程
查看>>
neo4j图形数据库Java应用
查看>>
Neo4j图数据库_web页面关闭登录实现免登陆访问_常用的cypher语句_删除_查询_创建关系图谱---Neo4j图数据库工作笔记0013
查看>>
Neo4j图数据库的介绍_图数据库结构_节点_关系_属性_数据---Neo4j图数据库工作笔记0001
查看>>
Neo4j图数据库的数据模型_包括节点_属性_数据_关系---Neo4j图数据库工作笔记0002
查看>>
Neo4j安装部署及使用
查看>>
Neo4j电影关系图Cypher
查看>>
Neo4j的安装与使用
查看>>
Neo4j(1):图数据库Neo4j介绍
查看>>
Neo4j(2):环境搭建
查看>>
Neo4j(3):Neo4j Desktop安装
查看>>