日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

体感Kinect手势识别开发基本原理

發布時間:2025/4/14 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 体感Kinect手势识别开发基本原理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

下述代碼摘自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

總結

以上是生活随笔為你收集整理的体感Kinect手势识别开发基本原理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。