2012年8月31日金曜日

KINECTサンプル(VB) SkeletonTracking for SDK1.5

KINECTサンプルプログラム 骨格追跡 のVB版です。

C#版と内容はほとんど同じです。

違うところは関節部分を表す円のサイズを距離によって変化するようにしてみました。


MainWindow.xaml
------------------------------------------------------------------------------

<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="519" Width="1175">
    <Grid Width="1141">
        <Canvas Height="480" HorizontalAlignment="Left" Name="canvas1" VerticalAlignment="Top" Width="640" />
        <TextBox Height="40" HorizontalAlignment="Left" Margin="743,46,0,0" Name="skelx" VerticalAlignment="Top" Width="120" FontSize="20" />
        <TextBox Height="40" HorizontalAlignment="Left" Margin="869,46,0,0" Name="skely" VerticalAlignment="Top" Width="120" FontSize="20" />
        <TextBox Height="40" HorizontalAlignment="Left" Margin="995,46,0,0" Name="skelz" VerticalAlignment="Top" Width="120" FontSize="20" />
        <TextBox Height="40" HorizontalAlignment="Left" Margin="743,95,0,0" Name="depthx" VerticalAlignment="Top" Width="120" FontSize="20" />
        <TextBox Height="40" HorizontalAlignment="Left" Margin="869,95,0,0" Name="depthy" VerticalAlignment="Top" Width="120" FontSize="20" />
        <TextBox Height="40" HorizontalAlignment="Left" Margin="995,95,0,0" Name="depthz" VerticalAlignment="Top" Width="120" FontSize="20" />
        <Label Content="Skeleton" Height="40" HorizontalAlignment="Left" Margin="646,46,0,0" Name="label1" VerticalAlignment="Top" FontSize="20" />
        <Label Content="Depth" FontSize="20" Height="40" HorizontalAlignment="Left" Margin="671,95,0,0" Name="label2" VerticalAlignment="Top" />
        <Label Content="Z" FontSize="20" Height="40" HorizontalAlignment="Left" Margin="995,0,0,0" Name="label3" VerticalAlignment="Top" Width="120" HorizontalContentAlignment="Center" />
        <Label Content="X" FontSize="20" Height="40" HorizontalAlignment="Left" Margin="743,0,0,0" Name="label4" VerticalAlignment="Top" Width="120" HorizontalContentAlignment="Center" />
        <Label Content="Y" FontSize="20" Height="40" HorizontalAlignment="Left" Margin="869,0,0,0" Name="label5" VerticalAlignment="Top" Width="120" HorizontalContentAlignment="Center" />
    </Grid>
</Window>
------------------------------------------------------------------------------
C#版と一緒です。
キャンバスとテキストボックスを配置しています。

MainWindow.xaml.cs
------------------------------------------------------------------------------

Imports Microsoft.Kinect

Class MainWindow
    Inherits Window

    Private kinect As KinectSensor
    Private skeletonData As Skeleton()


    ''' <summary>
    '''
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub New()

        ' この呼び出しはデザイナーで必要です。
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後で初期化を追加します。

        ''接続の確認
        If KinectSensor.KinectSensors.Count = 0 Then
            MessageBox.Show("KINECTが見つかりません。")
            Exit Sub
        End If

        kinect = KinectSensor.KinectSensors(0)

        ''Depthカメラを有効にする
        kinect.DepthStream.Enable(DepthImageFormat.Resolution640x480Fps30)
        ''骨格追跡を有効にする
        kinect.SkeletonStream.Enable()

        ''イベントの登録
        AddHandler kinect.AllFramesReady, AddressOf kinect_AllFramesReady

        ''KINECTのスタート
        kinect.Start()

    End Sub

    ''' <summary>
    '''
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub kinect_AllFramesReady(ByVal sender As Object, ByVal e As AllFramesReadyEventArgs)

        ''フレームデータの取得
        Using skelFrame As SkeletonFrame = e.OpenSkeletonFrame()
            Using depthFrame As DepthImageFrame = e.OpenDepthImageFrame()

                If skelFrame Is Nothing = False Then
                    ''キャンバスのクリア
                    canvas1.Children.Clear()

                    ''Skeletonデータの取得
                    skeletonData = New Skeleton(skelFrame.SkeletonArrayLength - 1) {}
                    skelFrame.CopySkeletonDataTo(skeletonData)

                    ''プレイヤーごとの描画
                    For Each skel In skeletonData
                        If skel.TrackingState = SkeletonTrackingState.Tracked Then
                            ''骨格を描画
                            For Each jt As Joint In skel.Joints
                                If jt.TrackingState <> JointTrackingState.NotTracked Then
                                    ''骨格の座標(頭)
                                    If jt.JointType = JointType.Head Then
                                        skelx.Text = jt.Position.X.ToString()
                                        skely.Text = jt.Position.Y.ToString()
                                        skelz.Text = jt.Position.Z.ToString()
                                    End If

                                    ''座標の変換(DepthFrame 640*480)
                                    Dim pt As DepthImagePoint = depthFrame.MapFromSkeletonPoint(jt.Position)

                                    ''depth座標に変換後の座標(頭)
                                    If jt.JointType = JointType.Head Then
                                        depthx.Text = pt.X.ToString()
                                        depthy.Text = pt.Y.ToString()
                                        depthz.Text = pt.Depth.ToString()
                                    End If

                                 
                                    ''円の表示
                                    If jt.TrackingState = JointTrackingState.Tracked Then
                                        Dim el As New Ellipse
                                        canvas1.Children.Add(el)
                                        With el
                                            .Margin = New Thickness(pt.X, pt.Y, 0, 0)
                                            .Fill = New SolidColorBrush(Colors.Green)
                                            .Width = CInt((4000 - pt.Depth) / 100) + 10
                                            .Height = CInt((4000 - pt.Depth) / 100) + 10
                                        End With
                                    Else
                                        Dim el As New Ellipse
                                        canvas1.Children.Add(el)
                                        With el
                                            .Margin = New Thickness(pt.X, pt.Y, 0, 0)
                                            .Fill = New SolidColorBrush(Colors.Red)
                                            .Width = CInt((4000 - pt.Depth) / 100) + 10
                                            .Height = CInt((4000 - pt.Depth) / 100) + 10
                                        End With
                                    End If
                                End If
                            Next
                        End If
                    Next


                End If

            End Using
        End Using

------------------------------------------------------------------------------
プログラムの内容はC#版を参照してください。
違うところは円を表示するところでサイズを距離に応じて変えている部分になります。
「CInt((4000 - pt.Depth) / 100)」式のうち4000はデフォルトモードでの認識最大距離4mをミリメートルとしているためです。ちょっとだけ3Dっぽく見えるはずです。


0 件のコメント:

コメントを投稿