0

目前我正在编写一个使用我的 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
4

1 回答 1

0

“这是我想单独讨论的“sendkeys”部分”

代替:

Dim WshShell = CreateObject("WScript.Shell")
WshShell.SendKeys("{Right}")

您可以直接使用VB.Net 内置的SendKeys.Send() :

SendKeys.Send("{Right}")

至于线程部分,您的目标是通过在箭头键之间放置延迟来限制箭头键吗?如果是,您可以使用工具箱中的标准 Timer() 来打开/关闭。您可以设置一个布尔值来指示是否仍应发送箭头,然后在 Tick() 事件中检查它以了解何时关闭计时器。

于 2013-05-06T14:25:36.993 回答