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っぽく見えるはずです。
------------------------------------------------------------------------------
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 件のコメント:
コメントを投稿