本文共 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