//注意:1.安装Kinect SDK 1.0以上, // 2.引用Microsoft.Kinect.dll库 private Graphics g;//界面画布对象 private KinectSensor kinect = null;//指向Kinect对象 private Skeleton[] skeletonData; //存储从Kinect传感器接收到的数据对象 private void StartKinectST() { // Get first Kinect Sensor kinect = KinectSensor.KinectSensors.FirstOrDefault(s => s.Status == KinectStatus.Connected); //注意:此判断MS目前无效 if (null == kinect) { this.ShowDialog(); } this.Text = "正在检测Kinect传感器..."; // 允许骨骼跟踪 kinect.SkeletonStream.Enable(); //关闭颜色和景深数据的接收 kinect.ColorStream.Disable(); kinect.DepthStream.Disable(); skeletonData = new Skeleton[kinect.SkeletonStream.FrameSkeletonArrayLength]; // Get Ready for Skeleton Ready Events kinect.SkeletonFrameReady += new EventHandler<SkeletonFrameReadyEventArgs>(kinect_SkeletonFrameReady); // Start Kinect sensor kinect.Start(); } //接收到数据的处理事件 private void kinect_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e) { try { ////Tracked that defines whether a skeleton is 'tracked' or not. ////The untracked skeletons only give their position. //if (SkeletonTrackingState.Tracked != data.TrackingState) continue; this.Text = "Kinect传感器连结成功!"; using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame()) // Open the Skeleton frame { // check that a frame is available if (skeletonFrame != null && this.skeletonData != null) { // get the skeletal information in this frame skeletonFrame.CopySkeletonDataTo(this.skeletonData); } } foreach (Skeleton skeleton in this.skeletonData) { if (null != skeleton) { if (skeleton.TrackingState == SkeletonTrackingState.Tracked) { Console.WriteLine("KinectID: " + skeleton.TrackingId); //只处理跟踪移动的数据 DrawTrackedSkeletonJoints(skeleton.Joints); } else if (skeleton.TrackingState == SkeletonTrackingState.PositionOnly) { //temDrawSkeletonPosition(skeleton.Position); } } else { Console.WriteLine("null Skeleton"); } } } catch (Exception ex) { this.Text="Kinect失去连结,请检查USB或电源"; } } //处理各个节点移动数据 private void DrawTrackedSkeletonJoints(JointCollection jointCollection) { // String s = kinect.UniqueKinectId; //以下为获取左右手、臂、膝盖、脚和头部的跟踪数据 // Render Head and Shoulders //DrawBone(jointCollection[JointType.Head], jointCollection[JointType.ShoulderCenter]); //DrawBone(jointCollection[JointType.ShoulderCenter], jointCollection[JointType.ShoulderLeft]); //DrawBone(jointCollection[JointType.ShoulderCenter], jointCollection[JointType.ShoulderRight]); // Render Left Arm drarHand(true,jointCollection[JointType.HandLeft]); //DrawBone(jointCollection[JointType.ShoulderLeft], jointCollection[JointType.ElbowLeft]); // DrawBone(jointCollection[JointType.ElbowLeft], jointCollection[JointType.WristLeft]); //DrawBone(jointCollection[JointType.WristLeft], jointCollection[JointType.HandLeft]); // Render Right Arm drarHand(false,jointCollection[JointType.HandRight]); //DrawBone(jointCollection[JointType.ShoulderRight], jointCollection[JointType.ElbowRight]); // DrawBone(jointCollection[JointType.ElbowRight], jointCollection[JointType.WristRight]); //DrawBone(jointCollection[JointType.WristRight], jointCollection[JointType.HandRight]); // Render other bones... } int srcXLeft, srcYLeft; int srcXRight, srcYRight; //画左右手的点 private void drarHand(Boolean isLeft,Joint joint) { if (joint.TrackingState == JointTrackingState.Tracked && joint.TrackingState == JointTrackingState.Tracked) { ColorImagePoint cp1 = kinect.MapSkeletonPointToColor(joint.Position, ColorImageFormat.RgbResolution640x480Fps30); Point po = new Point((int)cp1.X, (int)cp1.Y); Console.WriteLine("to draw Ellipse x:" + po.X + " y:" + po.Y); if (isLeft) { Pen srcP = new Pen(this.BackColor, 4); g.DrawEllipse(srcP, srcXLeft, srcYLeft, 30,10); Pen p = new Pen(Color.Red, 4); g.DrawEllipse(p, po.X, po.Y, 30, 10); srcXLeft = po.X; srcYLeft = po.Y; } else { Pen srcP = new Pen(this.BackColor, 4); g.DrawEllipse(srcP, srcXRight, srcYRight,20, 20); Pen p = new Pen(Color.Green, 4); g.DrawEllipse(p, po.X, po.Y, 20, 20); srcXRight = po.X; srcYRight = po.Y; } } } }
Kinect基本代码备忘
猜你喜欢
转载自javafound.iteye.com/blog/1886725
今日推荐
周排行