Kinect for Windows SDK开发入门(九)骨骼追踪进阶 下

1. 基于景深数据的用户交互

到目前为止我们只用了骨骼数据中关节点的X,Y值。然而Kinect产生的关节点数据除了X,Y值外还有一个深度值。基于Kinect的应用程序应该利用好这个深度值。下面的部分将会介绍如何在Kinect应用程序中使用深度值。

除了使用WPF的3D特性外,在布局系统中可以根据深度值来设定可视化元素的尺寸大小来达到某种程序的立体效果。下面的例子使用Canvas.ZIndex属性来设置元素的层次,手动设置控件的大小并使用ScaleTransform来根据深度值的改变来进行缩放。用户界面包括一些圆形,每一个圆代表一定的深度。应用程序跟踪用户的手部关节点,以手形图标显示,图标会根据用户手部关节点的深度值来进行缩放,用户离Kinect越近,手形图表越大,反之越小。

创建一个新的WPF项目,主界面的XAML如下。主要的布局容器为Cnavas容器。它包含5个Ellipses及对应的TextBlock控件,TextBlock用来对圆形进行说明。这几个圆形随机分布在屏幕上,但是圆形的Canvas.ZIndex是确定的。Canvas容器也包含了两个图像控件,用来代表两只手。每一个手部图标都定义了一个ScaleTransform对象。手形图标是和右手方向一致的,将ScaleTransform的ScaleX设置为-1可以将其反转,看起来像左手。

<Window x:Class="KinectDepthBasedInteraction.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Depth UI Target" Height="1080" Width="1920" WindowState="Maximized" Background="White">
    <Window.Resources>
        <Style x:Key="TargetLabel" TargetType="TextBlock" >
            <Setter Property="FontSize" Value="40" />
            <Setter Property="Foreground" Value="White"/>
            <Setter Property="FontWeight" Value="Bold" />
            <Setter Property="IsHitTestVisible" Value="False" />
        </Style>
    </Window.Resources>
    <Viewbox>

        <Grid x:Name="LayoutRoot" Width="1920" Height="1280">
            <Image x:Name="DepthImage"/>
            <StackPanel HorizontalAlignment="Left" VerticalAlignment="Top">
                <TextBlock x:Name="DebugLeftHand" Style="{StaticResource TargetLabel}" Foreground="Black" />
                <TextBlock x:Name="DebugRightHand" Style="{StaticResource TargetLabel}" Foreground="Black" />
            </StackPanel>
            <Canvas>
                <Ellipse x:Name="Target3" Fill="Orange" Height="200" Width="200" Canvas.Left="776" Canvas.Top="162" Canvas.ZIndex="1040" />
                <TextBlock Text="3" Canvas.Left="860" Canvas.Top="206" Panel.ZIndex="1040" Style="{StaticResource TargetLabel}" />

                <Ellipse x:Name="Target4" Fill="Purple" Height="150" Width="150" Canvas.Left="732" Canvas.Top="320" Canvas.ZIndex="940" />
                <TextBlock Text="4" Canvas.Left="840" Canvas.Top="372" Panel.ZIndex="940" Style="{StaticResource TargetLabel}" />

                <Ellipse x:Name="Target5" Fill="Green" Height="120" Width="120" Canvas.Left="880" Canvas.Top="592" Canvas.ZIndex="840" />
                <TextBlock Text="5" Canvas.Left="908" Canvas.Top="590" Panel.ZIndex="840" Style="{StaticResource TargetLabel}" />

                <Ellipse x:Name="Target6" Fill="Blue" Height="100" Width="100" Canvas.Left="352" Canvas.Top="544" Canvas.ZIndex="740" />
                <TextBlock Text="6" Canvas.Left="368" Canvas.Top="582" Panel.ZIndex="740" Style="{StaticResource TargetLabel}" />

                <Ellipse x:Name="Target7" Fill="Red" Height="85" Width="85" Canvas.Left="378" Canvas.Top="192" Canvas.ZIndex="640" />
                <TextBlock Text="7" Canvas.Left="422" Canvas.Top="226" Panel.ZIndex="640" Style="{StaticResource TargetLabel}" />

                <Image x:Name="LeftHandElement" Source="Images/hand.png" Width="80" Height="80" RenderTransformOrigin="0.5,0.5">
                    <Image.RenderTransform>
                        <ScaleTransform x:Name="LeftHandScaleTransform" ScaleX="1" CenterY="-1" />
                    </Image.RenderTransform>
                </Image>

                <Image x:Name="RightHandElement" Source="Images/hand.png" Width="80" Height="80" RenderTransformOrigin="0.5,0.5">
                    <Image.RenderTransform>
                        <ScaleTransform x:Name="RightHandScaleTransform" CenterY="1" ScaleX="1" />
                    </Image.RenderTransform>
                </Image>
            </Canvas>
        </Grid>
    </Viewbox>
</Window

不同颜色的圆形代表不同的深度,例如名为Target3的元素代表距离为3英尺。Target3的长宽比Target7要大,这简单的通过缩放可以实现。在我们的实例程序中,我们将其大小进行硬编码,实际的程序中,应该根据特定要求可以进行缩放。Canvas容器会根据子元素的Canvas.ZIndex的值对元素在垂直于计算机屏幕的方向上进行排列,例如最上面的元素,其Canvas.ZIndex最大。如果两个元素有相同的ZIndex值,那么会根据其在XAML中声明的顺序进行显示,在XAML中,后面声明的元素在之前声明的元素的前面。对于Canvas的所有子元素,ZIndex值越大,离屏幕越近,越小离屏幕越远。将深度值取反刚好能达到想要的效果。这意味这我们不能直接使用深度值来给ZIndex来赋值,而要对它进行一点转换。Kinect能够产生的最大深度值为13.4英尺,相应的,我们将Canvas.Zindex的取值范围设置为0-1340,将深度值乘以100能获得更好的精度。因此Target5的Canvas.ZIndex设置为840(13.5-5=8.4*100=840)。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索控件
, kinect
, 图标
, kinect2.0
, kinect2.0 win8.1
, kinect开发
, 深度
, 圆形
, #深度值
一个
kinect 骨骼点追踪、kinect骨骼跟踪、kinect2.0骨骼节点、kinect 骨骼、kinect获取骨骼坐标,以便于您获取更多的相关知识。

时间: 2024-11-02 12:16:37

Kinect for Windows SDK开发入门(九)骨骼追踪进阶 下的相关文章

Kinect for Windows SDK开发入门(八)骨骼追踪进阶 上

前7篇文件我们介绍了Kinect SDK中各种传感器的各种基本知识,我们用实验的方式演示了这些基本对象和方法的如何使用,这些都是Kinect开发最基本的知识.了解了这些基本知识后,就可以开发出一个基于Kinect的简单程序了.但是这些离开发出一个好的基于Kinect的应用程序还有一段距离.后面的文章中,将会结合Kinect SDK介绍WPF以及其它第三方工具,类库来建立一个以Kinect为驱动的有较好用户体验的程序.我们将利用之前讲到的知识来进行下面一些比较复杂的话题. Kinect传感器核心只

Kinect for Windows SDK开发入门(七)骨骼追踪基础 下

上一篇文章用在UI界面上绘制骨骼数据的例子展示了骨骼追踪系统涉及的主要对象,然后详细讨论了骨骼追踪中所涉及的对象模型.但是了解了基本概念是一回事,能够建立一个完整的可用的应用程序又是另外一回事,本文通过介绍一个简单的Kinect游戏来详细讨论如何应用这些对象来建立一个完整的Kinect应用,以加深对Kinect骨骼追踪所涉及的各个对象的了解. 1. Kinect连线游戏 相信大家在小时候都做过一个数学题目,就是在纸上将一些列数字(用一个圆点表示)从小到大用线连起来.游戏逻辑很简单,只不过我们在这

Kinect for Windows SDK开发入门(六)骨骼追踪基础 上

Kinect产生的景深数据作用有限,要利用Kinect创建真正意义上交互,有趣和难忘的应用,还需要除了深度数据之外的其他数据.这就是骨骼追踪技术的初衷,骨骼追踪技术通过处理景深数据来建立人体各个关节的坐标,骨骼追踪能够确定人体的各个部分,如那部分是手,头部,以及身体.骨骼追踪产生X,Y,Z数据来确定这些骨骼点.在上文中,我们讨论了景深图像处理的一些技术.骨骼追踪系统采用的景深图像处理技术使用更复杂的算法如矩阵变换,机器学习及其他方式来确定骨骼点的坐标. 本文首先用一个例子展示骨骼追踪系统涉及的主

Kinect for Windows SDK开发入门(十四)进阶指引 上

前面十三篇文章介绍了Kinect SDK开发中的各个方面的最基础的知识.正如本系列博闻标题那样,这些知识只是Kinect for windows SDK开发的入门知识.本文将会介绍Kinect进阶开发需要了解一些知识(beyond the basic). 读者可能会注意到,在学习了前面十三篇文章中关于Kinect开发的方方面面,如影像数据流.景深摄像机.骨骼追踪.麦克风阵列.语音识别等这些知识后,离开发出一些我们在网上看到的那些具有良好用户体验的Kinect应用程序还是显得捉襟见肘.Kinect

Kinect for Windows SDK开发入门(二)基础知识 上

上篇文章介绍了Kinect开发的环境配置,这篇文章和下一篇文章将介绍Kinect开发的基本知识,为深入研究Kinect for Windows SDK做好基础. 每一个Kinect应用都有一些基本元素.应用程序必须探测和发现链接到设备上的Kinect传感器.在使用这些传感器之前,必须进行初始化,一旦初始化成功后,就能产生数据,我们的程序就能处理这些数据.最后当应用程序关闭是,必须合理的释放这些传感器. 本文第一部分将会介绍如何探测初始化几释放传感器,这是非常基础的话题,但是对于基于Kinect开

Kinect for Windows SDK开发入门(十五)进阶指引 下

上一篇文章介绍了Kinect for Windows SDK进阶开发需要了解的一些内容,包括影像处理Coding4Fun Kinect工具类库以及如何建立自己的扩展方法类库来方便开发,接下来介绍了利用Kinect进行近距离探测的一些方法,限于篇幅原因,仅仅介绍了近距离探测的三种方式.  本文接上文将继续介绍近距离探测中如何探测运动,如何获取并保存产生的影像数据:然后将会介绍如何进行脸部识别,以及介绍全息图(Holograme)的一些知识,最后介绍了一些值得关注的类库和项目. 2.4 运动识别 目

Kinect for Windows SDK开发入门(一) 开发环境配置

前几天无意中看到微软发布了Kinect for windows sensor,进去看了一下Kinect应用的例子,发现 Kinect除了作为xbox360游戏的外设外还能开发一些很酷的应用,而且微软也发布可针对Kinect开发的 Kinect for windows SDK1.0正式版本,原本想买一个Kinect for windows sensor来进行开发玩一玩的 ,可是那个出来没多久,淘宝上只有代购的,而且比Kinect for Xbox360 sensor贵了很多,而且只能进 行开发,考

Kinect for Windows SDK开发入门(十二)语音识别 上

Kinect的麦克风阵列在Kinect设备的下方.这一阵列由4个独立的水平分布在Kinect下方的麦克风组成.虽然每一个麦克风都捕获相同的音频信号,但是组成阵列可以探测到声音的来源方向.使得能够用来识别从某一个特定的方向传来的声音.麦克风阵列捕获的音频数据流经过复杂的音频增强效果算法处理来移除不相关的背景噪音.所有这些复杂操作在Kinect硬件和Kinect SDK之间进行处理,这使得能够在一个大的空间范围内,即使人离麦克风一定的距离也能够进行语音命令的识别. 在Kinect第一次作为Xbox3

Kinect for Windows SDK开发入门(五)景深数据处理 下

1. 简单的景深影像处理 在上篇文章中,我们讨论了如何获取像素点的深度值以及如何根据深度值产生影像.在之前的例子中,我们过滤掉了阈值之外的点.这就是一种简单的图像处理,叫阈值处理.使用的阈值方法虽然有点粗糙,但是有用.更好的方法是利用机器学习来从每一帧影像数据中计算出阈值.Kinect深度值最大为4096mm,0值通常表示深度值不能确定,一般应该将0值过滤掉.微软建议在开发中使用1220mm(4')~3810mm(12.5')范围内的值.在进行其他深度图像处理之前,应该使用阈值方法过滤深度数据至