2017-07-18 20 views
0

私はkinect 360とwindows sdk 1.8で作業しています。私はc#wpfで開発されたアプリケーションを手にジェスチャーでマウスカーソルを動かすことができ、クリックすることもできます。 問題は、私がカーソルを角に動かすたびに、私はkinectの前で一歩踏み出す必要があることです。 しかし、私はそのような方法でカーソルをスケールしたいので、私は手を動かすだけで、カーソルはすべての画面に移動する必要があります。ここでkinectを使って画面コーナーにカーソルを移動する方法は?

は、私がこのkinect for c# devsimilar to youtube video codeを試してみましたが、このチュートリアルで以来、彼はSDK 1.0を使用しており、いくつかの方法が絶対あるので、私は 缶を私の手を追跡することができません

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; 
    } 

をしようとしていますコードです私の手のわずかな動きでカーソルをすべての画面に移動できるので、カーソルを使って手の動きを正確に拡大する方法を教えてください。ここで

+0

kinect sdk v2を使用できますか?可能であれば、問題は解決されるでしょう。それ以外はあなたの問題を解決しようとすることができます – bingcheng45

+0

@ bingcheng45私はsdk v2を試していませんでした。あなたは私にsdk v2でこのコードでやっているのと同じことをする方法を見つけることができるリンクや記事を提案することができますか?もしあなたが私の現在のコードを手伝ってくれれば、あなたにはうれしいでしょう。前もって感謝します。 –

+0

私は本当にこれについての記事を見つけることができませんが、あなたが見て試してみるために、ホバリングといくつかのデフォルトジェスチャーがgithub上で機能するコードを持つことができます。もしあなたが有用であると分かっていれば、私はupvote XP – bingcheng45

答えて

0

は、KinectのSDKのV2すでに

基本的に最初のあなたは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> 
にこのセクションを追加使用してMicrosoft.Kinectの参照を追加したと仮定すると、 https://github.com/bingcheng45/Kinect-v2-Hovering-Example

のプロジェクトソリューションです

このコード行をMainwindow.Xaml.csに追加してくださいあなたは行くのが良いです!

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 
     } 

乾杯!

+0

助けてくれてありがとう、それは私がkinect xbox 360とsdk v2を持っていると言ったように仕事をしなかった。 kinect sdk v2の設定マネージャーが私のUSB 3.0がkinectと互換性がないと言っています –

+0

しかし、kinectは私がsdk 1.8を使用するとうまく動作します...... –

+0

うまくいきました。違いについてこれを読んだ後、http://zugara.com/how-does-the-kinect-2-compare-to-the-kinect-1私は、最新のSDKを使用しても害はないと感じている – bingcheng45

関連する問題