2017-07-18 2 views
0

ich arbeite mit kinect 360 und windows sdk 1.8. Ich habe eine Anwendung in C# wpf entwickelt, die Mauszeiger mit Handgesten bewegen können und in der Lage auch zu klicken. Das Problem ist, wenn ich den Cursor in die Ecke bewegen will, muss ich einen Schritt vor Kinect machen, um das zu tun. aber ich möchte den Cursor so skalieren, dass ich nur meine Hand bewegen muss und der Cursor sich auf den ganzen Bildschirm bewegt. HierWie bewegt man den Cursor mit kinect zu Bildschirmecken?

ist der Code, den ich versuche

void sensor_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e) 
    { 
     bool receivedData = false; 

     using (SkeletonFrame SFrame = e.OpenSkeletonFrame()) 
     { 
      if (SFrame == null) 
      { 
       return; 
      } 
      else 
      { 
       skeletons = new Skeleton[SFrame.SkeletonArrayLength]; 
       SFrame.CopySkeletonDataTo(skeletons); 
       receivedData = true; 
      } 
     } 

     if (receivedData) 
     { 

      Skeleton currentSkeleton = (from s in skeletons 
             where s.TrackingState == SkeletonTrackingState.Tracked 
             select s).FirstOrDefault(); 

      if (currentSkeleton != null) 
      { 
       processing(currentSkeleton.Joints[JointType.HandRight]); 
       click(currentSkeleton.Joints[JointType.HandLeft], currentSkeleton.Joints[JointType.Head]); 
      } 
     } 
    } 
    private void processing(Joint handright) 
    { 
     Microsoft.Kinect.SkeletonPoint vector = new Microsoft.Kinect.SkeletonPoint(); 
     vector.X = ScaleVector(1600, handright.Position.X); 
     vector.Y = ScaleVector(900, -handright.Position.Y); 
     vector.Z = handright.Position.Z; 
     handright.Position = vector; 

     zAxis = handright.Position.Z; 



     leftofscreen = Convert.ToInt32(handright.Position.X); 
     topofscreen = Convert.ToInt32(handright.Position.Y); 

     SetCursorPos(leftofscreen, topofscreen); 

    } 
    private void click(Joint handleft, Joint head) 
    { 
     if (handleft.Position.Y > head.Position.Y) 
     { 
      mouse_event(LEFTDOWN, leftofscreen, topofscreen, 0, 0); 
      mouse_event(LEFTUP, leftofscreen, topofscreen, 0, 0); 

     } 
    } 

    private float ScaleVector(int length, float position) 
    { 
     float value = (((((float)length)/1f)/2f) * position) + (length/2); 
     if (value > length) 
     { 
      return (float)length; 
     } 
     if (value < 0f) 
     { 
      return 0f; 
     } 
     return value; 
    } 

ich versucht habe diese kinect for c# dev und similar to youtube video code aber da in diesem Tutorial ist er mit sdk 1.0 und einige Methoden sind absolut, so bin ich nicht in der Lage meine Hände verfolgen können jemand mir helfen, wie ich meine Handbewegung mit dem Cursor richtig skalieren kann, so kann ich Cursor auf den ganzen Bildschirm mit einer leichten Bewegung meiner Hand bewegen? Hier

+0

Können Sie kinect sdk v2 verwenden? wenn Sie können, würde das Problem gelöst werden. Andernfalls kann ich versuchen, Ihr Problem zu lösen – bingcheng45

+0

@ bingcheng45 ich versuchte nicht sdk v2. kannst du mir einen Link oder einen Artikel vorschlagen, wo ich finde, wie ich dasselbe mache, was ich in diesem Code mit sdk v2 mache, aber wenn du mir mit meinem aktuellen Code helfen kannst, der sehr nett von dir sein wird. Vielen Dank im Voraus. –

+0

Ich kann nicht wirklich einen Artikel dazu finden, aber ich kann meinen Code haben, der nur Schweben hat und einige Standardgesten auf github funktionieren, damit Sie sehen und ausprobieren können. Wenn Sie das nützlich finden, geben Sie mir ein upvote XP – bingcheng45

Antwort

0

ist die Projektlösung in Kinect sdk v2 https://github.com/bingcheng45/Kinect-v2-Hovering-Example

Angenommen Sie haben die Verwendung von Microsoft.Kinect Referenz hinzugefügt bereits

Grundsätzlich erste fügen Sie diesen Abschnitt in die MainWindow.xaml

<k:KinectRegion x:Name="kinectRegion"> 
     <Grid> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto" /> 
       <RowDefinition Height="*" /> 
      </Grid.RowDefinitions> 

      <Grid Grid.Row="0" Margin="10 0 10 20"> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="Auto" /> 
        <ColumnDefinition Width="*" /> 
       </Grid.ColumnDefinitions> 


       <k:KinectUserViewer Grid.Column="1" Height="100" HorizontalAlignment="Center" VerticalAlignment="Top" /> 
       <TextBlock Grid.Column="1" HorizontalAlignment="Right" Margin="0 0 -1 0" VerticalAlignment="Bottom" FontSize="18">Controls Basics</TextBlock> 
      </Grid> 

      <ContentControl Grid.Row="1" x:Name="navigationRegion"> 
       <Grid x:Name="kinectRegionGrid" Margin="10,20,10,20"> 
        <Button x:Name="btnCenter" Content="CLICK HERE" HorizontalAlignment="Left" Margin="174,48,0,0" Style="{StaticResource 
         FrameSelectorButtonStyle}" VerticalAlignment="Top" Width="158" Height="76" MouseLeave="btnCenter_MouseLeave" Click="btnCenter_Click" MouseEnter="btnCenter_MouseEnter" Background="#FFC9C9C9" TouchEnter="btnCenter_TouchEnter"/> 
        <Label x:Name="lbtext" Content="Label" HorizontalAlignment="Left" Margin="51,31,0,0" VerticalAlignment="Top"/> 

       </Grid> 
      </ContentControl> 
     </Grid> 
    </k:KinectRegion> 

dann fügen Sie einfach diese Codezeile in Ihrem Hauptfenster.Xaml.cs und du bist gut zu gehen!

public MainWindow() 
     { 
      InitializeComponent(); 

      //hovering start 
      KinectRegion.SetKinectRegion(this, kinectRegion); 

      App app = ((App)Application.Current); 
      app.KinectRegion = kinectRegion; 

      // Use the default sensor 
      this.kinectRegion.KinectSensor = KinectSensor.GetDefault(); 
      //hovering end 
     } 

Prost!

+0

Vielen Dank für die Hilfe, aber es hat nicht funktioniert, wie ich Ihnen sagte, ich habe kinect xbox 360 und sdk v2 arbeitet nicht damit. Konfigurationsmanager von kinect sdk v2 sagt mein usb 3.0 ist nicht kompatibel mit kinect benötigt möglicherweise einen Adapter –

+0

aber kinect funktioniert gut, wenn ich sdk 1.8 ...... –

+0

hmm, wenn es funktioniert, wenn Sie sdk 1.8 verwenden, dann bin ich nicht zu sicher über die Unterschiede. Nach dem Lesen dieser http://zugara.com/how-does-the-kinect-2-compare-to-the-kinect-1 denke ich, dass es keinen Schaden mit der neuesten sdk – bingcheng45

Verwandte Themen