溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

視頻數(shù)據(jù):骨骼數(shù)據(jù)采集(Skeleton Data)

發(fā)布時間:2020-10-07 16:46:46 來源:網(wǎng)絡(luò) 閱讀:7368 作者:桂素偉 欄目:編程語言

骨骼數(shù)據(jù)不像前兩個數(shù)據(jù),轉(zhuǎn)成字節(jié)數(shù)組,加載到圖片控件上。

一個Kinect for windows設(shè)備最多識別6個人,其中只有兩個人能識別完整,一個完整的人Kinect for windows中提供了全身20個關(guān)節(jié)的點,分別為:1、頭(Head),2、肩中央(ShoulderCenter),3、左肩(ShoulderLeft),4、右肩(ShoulderRight),5、左肘(ElbowLeft),6、右肘(ElbowRight),7、左腕(WristLeft),8、右腕(WristRight),9、左手(HandLeft),10、右手(HandRight),11、脊柱(Spine),12、髖中央(HipCenter),13、左髖(HipLeft),14、右髖(HipRight),15、左膝(KneeLeft),16、右膝(KneeRight),17、左髁(AnkleLeft),18、右髁(AnkleRight),19、左腳(FootLeft),20、右腳(FootRight)。

本例可以從骨骼數(shù)據(jù)中獲取這6個人的點,再找到被完整跟蹤的人(最多兩個人)的20個關(guān)節(jié)點顯示在屏幕上。

新建一個 Winform項目。

然后寫如下代碼:

  1. KinectSensor kinectsensor = null;  
  2. private void Form1_Shown(object sender, EventArgs e)  
  3. {  
  4.     //從Kinect集合中找到連接上的Kinect  
  5.     foreach (KinectSensor ks in KinectSensor.KinectSensors)  
  6.     {  
  7.         //找到連接的Kinect  
  8.         if (ks.Status == KinectStatus.Connected)  
  9.         {  
  10.             kinectsensor = ks;  
  11.             //平滑參數(shù)  
  12.             TransformSmoothParameters smoothingParam = new TransformSmoothParameters();  
  13.             //調(diào)用骨骼流  
  14.             kinectsensor.SkeletonStream.Enable(smoothingParam);  
  15.             //設(shè)置更近模  
  16.             kinectsensor.DepthStream.Range = DepthRange.Near;  
  17.             //骨骼模式為更近模式  
  18.             kinectsensor.SkeletonStream.EnableTrackingInNearRange = true;  
  19.             //坐姿或站姿  坐姿中識別上半身的10個點,默認模式識別全身20個點  
  20.             //kinectsensor.SkeletonStream.TrackingMode = SkeletonTrackingMode.Seated;  
  21.             //訂閱骨骼識別事件  
  22.             kinectsensor.SkeletonFrameReady += kinectsensor_SkeletonFrameReady;  
  23.             kinectsensor.Start();//開始工作,即可以采集攝像頭和紅外攝像頭信息                
  24.             this.Text = "Kinect開始工作……";  
  25.             return;  
  26.         }  
  27.     }  
  28. }  
  29. //定義骨骼數(shù)組,因為一個Kinect最多可識別6個人,其中兩個人的骨骼的20個點可以識別,另4個人只識別成4個點  
  30. Skeleton[] skeletonDataArr;  
  31. void kinectsensor_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)  
  32. {  
  33.     this.Refresh();  
  34.  
  35.     using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame()) // Open the Skeleton frame  
  36.     {  
  37.         //實例化骨骼數(shù)組  
  38.         this.skeletonDataArr = new Skeleton[kinectsensor.SkeletonStream.FrameSkeletonArrayLength];  
  39.  
  40.         if (skeletonFrame != null && this.skeletonDataArr != null)  
  41.         {  
  42.             //復(fù)制數(shù)據(jù)到骨骼數(shù)組中  
  43.             skeletonFrame.CopySkeletonDataTo(this.skeletonDataArr);  
  44.             //設(shè)定人與人間的距離間隔  
  45.             int Distance = 0;  
  46.             //遍歷識別最多識別的6個人  
  47.             foreach (var skeletondata in skeletonDataArr)  
  48.             {  
  49.                 Graphics gra = this.CreateGraphics();  
  50.                 //設(shè)定放大步長為200  
  51.                 int step = 200;  
  52.                 //繪制6個人的位置  
  53.                 gra.FillEllipse(new SolidBrush(Color.Blue), (skeletondata.Position.X + 1) * step + Distance, (1 - skeletondata.Position.Y) * step, 10, 10);  
  54.                 #region 繪制被跟蹤到的完整的人  
  55.                 if (skeletondata.TrackingState == SkeletonTrackingState.Tracked)  
  56.                 {  
  57.                     if (skeletondata.Joints.Count > 0)  
  58.                     {  
  59.                         //定義紅色的筆  
  60.                         Pen pen = new Pen(Color.Red, 3f);  
  61.  
  62.                         //得到頭部聯(lián)合點  
  63.                         Joint HeadJoint = skeletondata.Joints.SingleOrDefault(joi => joi.JointType == JointType.Head);  
  64.                         //得到肩中聯(lián)合點  
  65.                         Joint ShoulderCenterJoint = skeletondata.Joints.SingleOrDefault(joi => joi.JointType == JointType.ShoulderCenter);  
  66.                         //畫頭和肩中的連線  
  67.                         gra.DrawLine(pen, (HeadJoint.Position.X + 1) * step + Distance, (1 - HeadJoint.Position.Y) * step,  
  68.                             (ShoulderCenterJoint.Position.X + 1) * step + Distance, (1 - ShoulderCenterJoint.Position.Y) * step);  
  69.  
  70.                         //得到左肩聯(lián)合點  
  71.                         Joint ShoulderLeftJoint = skeletondata.Joints.SingleOrDefault(joi => joi.JointType == JointType.ShoulderLeft);  
  72.                         //畫左肩和肩中的連線  
  73.                         gra.DrawLine(pen, (ShoulderCenterJoint.Position.X + 1) * step + Distance, (1 - ShoulderCenterJoint.Position.Y) * step,  
  74.                             (ShoulderLeftJoint.Position.X + 1) * step + Distance, (1 - ShoulderLeftJoint.Position.Y) * step);  
  75.  
  76.                         //得到右肩聯(lián)合點  
  77.                         Joint ShoulderRightJoint = skeletondata.Joints.SingleOrDefault(joi => joi.JointType == JointType.ShoulderRight);  
  78.                         //畫右肩和肩中的連線  
  79.                         gra.DrawLine(pen, (ShoulderRightJoint.Position.X + 1) * step + Distance, (1 - ShoulderRightJoint.Position.Y) * step,  
  80.                             (ShoulderCenterJoint.Position.X + 1) * step + Distance, (1 - ShoulderCenterJoint.Position.Y) * step);  
  81.  
  82.                         //得到左肘聯(lián)合點   
  83.                         Joint ElbowLeftJoint = skeletondata.Joints.SingleOrDefault(joi => joi.JointType == JointType.ElbowLeft);  
  84.                         //畫左肩和左肘的連線  
  85.                         gra.DrawLine(pen, (ShoulderLeftJoint.Position.X + 1) * step + Distance, (1 - ShoulderLeftJoint.Position.Y) * step,  
  86.                             (ElbowLeftJoint.Position.X + 1) * step + Distance, (1 - ElbowLeftJoint.Position.Y) * step);  
  87.                         //得到右肘聯(lián)合點   
  88.                         Joint ElbowRightJoint = skeletondata.Joints.SingleOrDefault(joi => joi.JointType == JointType.ElbowRight);  
  89.                         //畫右肩和右肘的連線  
  90.                         gra.DrawLine(pen, (ShoulderRightJoint.Position.X + 1) * step + Distance, (1 - ShoulderRightJoint.Position.Y) * step,  
  91.                             (ElbowRightJoint.Position.X + 1) * step + Distance, (1 - ElbowRightJoint.Position.Y) * step);  
  92.  
  93.                         //得到左腕聯(lián)合點   
  94.                         Joint WristLeftJoint = skeletondata.Joints.SingleOrDefault(joi => joi.JointType == JointType.WristLeft);  
  95.                         //畫左肘和左腕的連線  
  96.                         gra.DrawLine(pen, (WristLeftJoint.Position.X + 1) * step + Distance, (1 - WristLeftJoint.Position.Y) * step,  
  97.                             (ElbowLeftJoint.Position.X + 1) * step + Distance, (1 - ElbowLeftJoint.Position.Y) * step);  
  98.  
  99.                         //得到右腕聯(lián)合點   
  100.                         Joint WristRightJoint = skeletondata.Joints.SingleOrDefault(joi => joi.JointType == JointType.WristRight);  
  101.                         //畫右肘和右腕的連線  
  102.                         gra.DrawLine(pen, (WristRightJoint.Position.X + 1) * step + Distance, (1 - WristRightJoint.Position.Y) * step,  
  103.                             (ElbowRightJoint.Position.X + 1) * step + Distance, (1 - ElbowRightJoint.Position.Y) * step);  
  104.  
  105.                         //得到左手聯(lián)合點  
  106.                         Joint HandLeftJoint = skeletondata.Joints.SingleOrDefault(joi => joi.JointType == JointType.HandLeft);  
  107.                         //畫左手和左腕的連線  
  108.                         gra.DrawLine(pen, (WristLeftJoint.Position.X + 1) * step + Distance, (1 - WristLeftJoint.Position.Y) * step,  
  109.                             (HandLeftJoint.Position.X + 1) * step + Distance, (1 - HandLeftJoint.Position.Y) * step);  
  110.  
  111.                         //得到右手聯(lián)合點  
  112.                         Joint HandRightJoint = skeletondata.Joints.SingleOrDefault(joi => joi.JointType == JointType.HandRight);  
  113.                         //畫右手和右腕的連線  
  114.                         gra.DrawLine(pen, (WristRightJoint.Position.X + 1) * step + Distance, (1 - WristRightJoint.Position.Y) * step,  
  115.                             (HandRightJoint.Position.X + 1) * step + Distance, (1 - HandRightJoint.Position.Y) * step);  
  116.  
  117.                         //得到脊柱聯(lián)合點  
  118.                         Joint SpineJoint = skeletondata.Joints.SingleOrDefault(joi => joi.JointType == JointType.Spine);  
  119.                         //畫脊柱和肩中的連線  
  120.                         gra.DrawLine(pen, (SpineJoint.Position.X + 1) * step + Distance, (1 - SpineJoint.Position.Y) * step,  
  121.                             (ShoulderCenterJoint.Position.X + 1) * step + Distance, (1 - ShoulderCenterJoint.Position.Y) * step);  
  122.  
  123.                         //得到髖中聯(lián)合點  
  124.                         Joint HipCenterJoint = skeletondata.Joints.SingleOrDefault(joi => joi.JointType == JointType.HipCenter);  
  125.                         //畫脊柱和髖中的連線  
  126.                         gra.DrawLine(pen, (SpineJoint.Position.X + 1) * step + Distance, (1 - SpineJoint.Position.Y) * step,  
  127.                             (HipCenterJoint.Position.X + 1) * step + Distance, (1 - HipCenterJoint.Position.Y) * step);  
  128.  
  129.                         //得到左髖聯(lián)合點  
  130.                         Joint HipLeftJoint = skeletondata.Joints.SingleOrDefault(joi => joi.JointType == JointType.HipLeft);  
  131.                         //畫左髖和髖中的連線  
  132.                         gra.DrawLine(pen, (HipLeftJoint.Position.X + 1) * step + Distance, (1 - HipLeftJoint.Position.Y) * step,  
  133.                             (HipCenterJoint.Position.X + 1) * step + Distance, (1 - HipCenterJoint.Position.Y) * step);  
  134.  
  135.                         //得到右髖聯(lián)合點  
  136.                         Joint HipRightJoint = skeletondata.Joints.SingleOrDefault(joi => joi.JointType == JointType.HipRight);  
  137.                         //畫右髖和髖中的連線  
  138.                         gra.DrawLine(pen, (HipRightJoint.Position.X + 1) * step + Distance, (1 - HipRightJoint.Position.Y) * step,  
  139.                             (HipCenterJoint.Position.X + 1) * step + Distance, (1 - HipCenterJoint.Position.Y) * step);  
  140.  
  141.                         //得到左膝聯(lián)合點  
  142.                         Joint KneeLeftJoint = skeletondata.Joints.SingleOrDefault(joi => joi.JointType == JointType.KneeLeft);  
  143.                         //畫左髖和左膝的連線  
  144.                         gra.DrawLine(pen, (HipLeftJoint.Position.X + 1) * step + Distance, (1 - HipLeftJoint.Position.Y) * step,  
  145.                             (KneeLeftJoint.Position.X + 1) * step + Distance, (1 - KneeLeftJoint.Position.Y) * step);  
  146.  
  147.                         //得到右膝聯(lián)合點  
  148.                         Joint KneeRightJoint = skeletondata.Joints.SingleOrDefault(joi => joi.JointType == JointType.KneeRight);  
  149.                         //畫右髖和右膝的連線  
  150.                         gra.DrawLine(pen, (HipRightJoint.Position.X + 1) * step + Distance, (1 - HipRightJoint.Position.Y) * step,  
  151.                             (KneeRightJoint.Position.X + 1) * step + Distance, (1 - KneeRightJoint.Position.Y) * step);  
  152.  
  153.                         //得到左踝聯(lián)合點  
  154.                         Joint AnkleLeftJoint = skeletondata.Joints.SingleOrDefault(joi => joi.JointType == JointType.AnkleLeft);  
  155.                         //畫左踝和左膝的連線  
  156.                         gra.DrawLine(pen, (AnkleLeftJoint.Position.X + 1) * step + Distance, (1 - AnkleLeftJoint.Position.Y) * step,  
  157.                             (KneeLeftJoint.Position.X + 1) * step + Distance, (1 - KneeLeftJoint.Position.Y) * step);  
  158.  
  159.                         //得到右踝聯(lián)合點  
  160.                         Joint AnkleRightJoint = skeletondata.Joints.SingleOrDefault(joi => joi.JointType == JointType.AnkleRight);  
  161.                         //畫右踝和右膝的連線  
  162.                         gra.DrawLine(pen, (AnkleRightJoint.Position.X + 1) * step + Distance, (1 - AnkleRightJoint.Position.Y) * step,  
  163.                             (KneeRightJoint.Position.X + 1) * step + Distance, (1 - KneeRightJoint.Position.Y) * step);  
  164.  
  165.  
  166.                         //得到左腳聯(lián)合點  
  167.                         Joint FootLeftJoint = skeletondata.Joints.SingleOrDefault(joi => joi.JointType == JointType.FootLeft);  
  168.                         //畫左踝和左腳的連線  
  169.                         gra.DrawLine(pen, (AnkleLeftJoint.Position.X + 1) * step + Distance, (1 - AnkleLeftJoint.Position.Y) * step,  
  170.                             (FootLeftJoint.Position.X + 1) * step + Distance, (1 - FootLeftJoint.Position.Y) * step);  
  171.  
  172.                         //得到右腳聯(lián)合點  
  173.                         Joint FootRightJoint = skeletondata.Joints.SingleOrDefault(joi => joi.JointType == JointType.FootRight);  
  174.                         //畫右踝和右腳的連線  
  175.                         gra.DrawLine(pen, (AnkleRightJoint.Position.X + 1) * step + Distance, (1 - AnkleRightJoint.Position.Y) * step,  
  176.                             (FootRightJoint.Position.X + 1) * step + Distance, (1 - FootRightJoint.Position.Y) * step);  
  177.                     }  
  178.                 }  
  179.                 #endregion  
  180.                 //下一個人的位置往右偏200個像素  
  181.                 Distance += 200;  
  182.             }  
  183.         }  
  184.     }  
  185. }  
  186. private void Form1_FormClosing(object sender, FormClosingEventArgs e)  
  187. {  
  188.     if (kinectsensor.Status == KinectStatus.Connected)  
  189.     {  
  190.         kinectsensor.Stop();//結(jié)束Kinect采集工作  
  191.         MessageBox.Show("Kinect結(jié)束工作!");  
  192.     }  

 效果如下:

 我們看到屏幕上有6個藍色的點,代表可識別6個人,其中有兩個完整的人體骨骼,每個完整的人是有20個關(guān)節(jié)點的坐標(biāo)。

視頻數(shù)據(jù):骨骼數(shù)據(jù)采集(Skeleton Data)

 

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI