Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用kinect将光标移动到屏幕角?_C#_Wpf_Kinect - Fatal编程技术网

C# 如何使用kinect将光标移动到屏幕角?

C# 如何使用kinect将光标移动到屏幕角?,c#,wpf,kinect,C#,Wpf,Kinect,我正在使用kinect 360和windows sdk 1.8。我有一个用c#wpf开发的应用程序,它可以用手势移动鼠标光标,也可以单击鼠标。 问题是,每当我想将光标移动到拐角处时,我都需要在kinect前面跨一步才能做到这一点。 但我想以这种方式缩放光标,这样我只需移动我的手,光标就会移动到所有屏幕上 这是我正在尝试的代码 void sensor_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e) {

我正在使用kinect 360和windows sdk 1.8。我有一个用c#wpf开发的应用程序,它可以用手势移动鼠标光标,也可以单击鼠标。 问题是,每当我想将光标移动到拐角处时,我都需要在kinect前面跨一步才能做到这一点。 但我想以这种方式缩放光标,这样我只需移动我的手,光标就会移动到所有屏幕上

这是我正在尝试的代码

 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;
    }
void传感器\u SkeletonFrameReady(对象发送器,SkeletonFrameReadyEventArgs e)
{
bool receivedData=false;
使用(SkeletonFrame SFrame=e.OpenSkeletonFrame())
{
if(SFrame==null)
{
返回;
}
其他的
{
骨架=新骨架[SFrame.skeletonarraylelength];
SFrame.CopySkeletonDataTo(骨架);
receivedData=true;
}
}
如果(接收数据)
{
骨架currentSkeleton=(来自骨架中的s)
其中s.TrackingState==SkeletonTrackingState.Tracked
选择s).FirstOrDefault();
如果(currentSkeleton!=null)
{
处理(currentSkeleton.Joints[JointType.HandRight]);
单击(currentSkeleton.Joints[JointType.HandLeft],currentSkeleton.Joints[JointType.Head]);
}
}
}
私人作废处理(联合使用权)
{
Microsoft.Kinect.SkeletonPoint vector=新的Microsoft.Kinect.SkeletonPoint();
vector.X=ScaleVector(1600,右上角.X);
vector.Y=ScaleVector(900,-右侧位置.Y);
vector.Z=右把手.Position.Z;
位置=向量;
zAxis=右把手位置Z;
leftofscreen=Convert.ToInt32(handright.Position.X);
topofscreen=Convert.ToInt32(handright.Position.Y);
SetCursorPos(屏幕左侧、topofscreen);
}
专用空心单击(关节左侧、关节头部)
{
if(左把手位置Y>头部位置Y)
{
鼠标事件(LEFTDOWN、leftofscreen、topofscreen、0、0);
鼠标事件(LEFTUP、leftofscreen、topofscreen、0、0);
}
}
专用浮点ScaleVector(整数长度,浮点位置)
{
浮动值=((浮动)长度)/1f)/2f)*位置+(长度/2);
如果(值>长度)
{
返回(浮动)长度;
}
如果(值<0f)
{
返回0f;
}
返回值;
}
我已经试过了,但在本教程中,他使用的是sdk 1.0,有些方法是绝对的,所以我无法跟踪我的手
有人能帮助我如何正确地用光标缩放我的手的移动,这样我就可以用手的轻微移动将光标移动到所有屏幕上吗?

这是Kinect sdk v2中的项目解决方案

假设您已经添加了使用Microsoft.Kinect的引用

基本上,首先将此部分添加到
main窗口.xaml


干杯

您能够使用kinect sdk v2吗?如果你能,问题就会解决。否则我可以试着解决你的问题issue@bingcheng45我没有试过sdk v2。你能给我推荐一个链接或文章,在那里我可以找到如何使用sdk v2在代码中做同样的事情,但是如果你能帮助我使用我当前的代码,那将非常感谢你。提前谢谢你。我真的找不到这方面的文章,但我可以在github上设置我的代码,这些代码只有悬停和一些默认手势功能,供你查看和试用。如果您觉得这很有用,请给我一个投票,非常感谢您的帮助,但它没有像我告诉您的那样工作,我有kinect xbox 360,sdk v2不使用它。kinect sdk v2的配置管理器说我的usb 3.0与kinect不兼容,可能需要一个适配器。如果在使用sdk 1.8时它可以工作,那么我不太确定两者之间的区别。读完这篇文章后,我觉得使用最新的sdkyes没有什么坏处,它似乎应该可以工作,不管怎样,我在自己的代码中对缩放属性做了一些小的更改,它会移动到所有屏幕坐标。我想你的答案对于sdk v2是正确的,所以我将其标记为正确的谢谢你的帮助:)谢谢Zeeshan,如果你想开始使用kinect sdk v2,请查看我的github以获取参考,我有很多关于kinect的项目,你可以从中学习。是的,我将研究sdk v2,但首先我需要了解为什么我的xbox kinect不能使用sdk v2。
<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>
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
        }