目前我正在编写一个使用我的 kinect 传感器的程序。
我对使用 vb.net 非常陌生。
我已经阅读了许多关于线程的不同帖子,但它们通常涉及按钮单击事件。在一个事件中,当用户按下表单上的一个按钮时,该按钮将启动一个新线程来执行一些例程,因此它不会冻结主 UI。
然而,当谈到 Kinect 传感器时,例如 Skeleton Stream,它每秒不断更新 30 帧。我觉得自己好像被事件淹没了。
当我试图通过使用“Thread.Sleep”函数来减慢速度时,我的 UI 显然被锁定了。我正在尝试启动一个新线程来处理特定手势期间的动作,但我不确定天气是否可以使用我读过的一些线程示例,或者当事件在三十帧触发时如何在代码中实现它们第二。
这是我在“SkeltonFrameReady”事件子例程中的代码,它是我想单独处理的“sendkeys”部分,并让主 UI 更新人手的位置。
也许我需要一个单独的线程上的整个子程序?但是我需要显示人手相关位置的标签来实时更新,“Thread.Sleep”会阻止这种情况发生。
感谢您对处理此问题有一些想法。
Public Sub SensorSkeletonFrameReady(ByVal sender As Object, ByVal e As SkeletonFrameReadyEventArgs)
Dim skeletons(-1) As Skeleton
Dim passiveCount As Integer = 0
Dim activeCount As Integer = 0
Using skeletonFrame As SkeletonFrame = e.OpenSkeletonFrame()
If skeletonFrame IsNot Nothing Then
skeletons = New Skeleton(skeletonFrame.SkeletonArrayLength - 1) {}
skeletonFrame.CopySkeletonDataTo(skeletons)
End If
End Using
If skeletons.Length <> 0 Then
For Each skel As Skeleton In skeletons
'// Count the Number of People in the room up to six
If (skel.TrackingState = SkeletonTrackingState.Tracked) Then
activeCount = (activeCount + 1)
ElseIf (skel.TrackingState = SkeletonTrackingState.PositionOnly) Then
passiveCount = (passiveCount + 1)
End If
numPeople = (activeCount + passiveCount)
Dim People As String = numPeople.ToString
HowManyPeople.Text = "Number of People: " & People
''// Focus on the closest Person
Dim closestID As Integer = 0
If Not Me.kinect.SkeletonStream.AppChoosesSkeletons Then
Me.kinect.SkeletonStream.AppChoosesSkeletons = True
' Ensure AppChoosesSkeletons is set
End If
' Start with a far enough distance
Dim closestDistance As Single = 10000.0!
If (skel.Position.Z < closestDistance) Then
closestID = skel.TrackingId
closestDistance = skel.Position.Z
End If
If (closestID > 0) Then
' Track this skeleton
Me.kinect.SkeletonStream.ChooseSkeletons(closestID)
'//Swipe Right and Left
If ((skel.Joints(JointType.HandRight).Position.Z < skel.Joints(JointType.ElbowRight).Position.Z) _
AndAlso (skel.Joints(JointType.HandLeft).Position.Y < skel.Joints(JointType.ElbowLeft).Position.Y)) Then
' //right hand below head height
If ((skel.Joints(JointType.HandRight).Position.Y < skel.Joints(JointType.Head).Position.Y) _
AndAlso (skel.Joints(JointType.HandRight).Position.Y > skel.Joints(JointType.ShoulderRight).Position.Y)) Then
' //right hand right of left shoulder
If (skel.Joints(JointType.HandRight).Position.X > skel.Joints(JointType.ShoulderLeft).Position.X) Then
Dim XPosition = skel.Joints(JointType.HandRight).Position.X - skel.Joints(JointType.ShoulderRight).Position.X
CurrentHandPositionX.Text = "Horizontal-Position: " & XPosition.ToString
If XPosition > OldPosition Then
OldPosition = XPosition
KinectGesture.Text = "Swipe Right"
''//I would like this to be on a separte thread
Dim WshShell = CreateObject("WScript.Shell")
WshShell.SendKeys("{Right}")
Thread.Sleep(220)
ElseIf XPosition < OldPosition Then
OldPosition = XPosition
KinectGesture.Text = "Swipe Left"
''//I would like this to be on a separte thread as well
Dim WshShell = CreateObject("WScript.Shell")
WshShell.SendKeys("{Left}")
Thread.Sleep(220)
End If
End If
End If
End If
'//Selection "Press"
If ((skel.Joints(JointType.HandRight).Position.Z < skel.Joints(JointType.ElbowRight).Position.Z) _
AndAlso (skel.Joints(JointType.HandLeft).Position.Y < skel.Joints(JointType.ElbowLeft).Position.Y)) Then
'//right hand below head height
If ((skel.Joints(JointType.HandRight).Position.Y < skel.Joints(JointType.Head).Position.Y) _
AndAlso (skel.Joints(JointType.HandRight).Position.Y > skel.Joints(JointType.ShoulderRight).Position.Y)) Then
'//right hand right of left shoulder
If (skel.Joints(JointType.HandRight).Position.X > skel.Joints(JointType.ShoulderLeft).Position.X) Then
Dim ZPosition = skel.Joints(JointType.ShoulderCenter).Position.Z - skel.Joints(JointType.HandRight).Position.Z
CurrentHandPositionZ.Text = "Depth-Position: " & ZPosition.ToString
End If
End If
End If
'//Fast Scroll Right
If ((skel.Joints(JointType.HandRight).Position.Z < skel.Joints(JointType.ElbowRight).Position.Z) _
AndAlso (skel.Joints(JointType.HandLeft).Position.Y > skel.Joints(JointType.ShoulderLeft).Position.Y) _
AndAlso (skel.Joints(JointType.HandLeft).Position.Y < skel.Joints(JointType.Head).Position.Y)) Then
' //right hand below head height
If ((skel.Joints(JointType.HandRight).Position.Y < skel.Joints(JointType.Head).Position.Y) _
AndAlso (skel.Joints(JointType.HandRight).Position.Y > skel.Joints(JointType.ShoulderRight).Position.Y)) Then
' //right hand right of left shoulder
If (skel.Joints(JointType.HandRight).Position.X > skel.Joints(JointType.ShoulderRight).Position.X) Then
KinectGesture.Text = "Fast Scroll Right"
Dim WshShell = CreateObject("WScript.Shell")
WshShell.SendKeys("{Right}")
End If
End If
End If
End If
Next
End If
End Sub