kaorun55氏の「KINECT SDK Beta2 で、挿抜状態に応じたアプリの動作をする 」 を参考にVBに書き換えました。
まずは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="557" Width="669">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="149*" />
<RowDefinition Height="389*" />
</Grid.RowDefinitions>
<TextBox Name="kinectCount" Margin="0,0,0,97" FontSize="18" Text="Text" TextAlignment="Center" FontWeight="Bold" FontStretch="Normal" TextWrapping="NoWrap" VerticalContentAlignment="Center" />
<Image Name="image1" Height="240" Width="320" Margin="0,50,332,248" Grid.RowSpan="2" />
<Image Height="240" Margin="326,50,6,248" Name="image2" Width="320" Grid.RowSpan="2" />
<Image Height="240" Margin="0,149,332,0" Name="image3" Width="320" Grid.Row="1" />
<Image Height="240" Margin="326,149,6,0" Name="image4" Width="320" Grid.Row="1" />
</Grid>
</Window>
--------------------------------------------------------------------------------
TextBoxが1つとGrid内に4つのImageコントロールを配置しています。
メインソースです。
--------------------------------------------------------------------------------
Imports Microsoft.Research.Kinect.Nui
Class MainWindow
''Imageコントロール用配列
Public images As New ArrayList
Public Sub New()
' この呼び出しはデザイナーで必要です。
InitializeComponent()
' InitializeComponent() 呼び出しの後で初期化を追加します。
'イベントハンドラの追加
AddHandler Runtime.Kinects.StatusChanged, AddressOf Kinects_StatusChanged
''接続されているKINECTを確認
ShowKinectCount()
''接続されているKINECTの初期化
Dim kinect As Runtime
For Each kinect In Runtime.Kinects
InitKinect(kinect)
Next
''配列にImegeコントロールを追加
With images
.Add(image1)
.Add(image2)
.Add(image3)
.Add(image4)
End With
End Sub
Sub InitKinect(kinect As Runtime)
''KINECTの初期化
kinect.Initialize(RuntimeOptions.UseColor)
kinect.VideoStream.Open(ImageStreamType.Video, 2, ImageResolution.Resolution640x480, ImageType.Color)
''イベントハンドラの追加
AddHandler kinect.VideoFrameReady, AddressOf Kinect_VideoFrameReady
End Sub
Sub Kinects_StatusChanged(ByVal sender As Object, ByVal e As StatusChangedEventArgs)
''KINECT接続数の確認
ShowKinectCount()
''ステータス別に処理
If e.Status = KinectStatus.Connected Then
''接続されたとき初期化
InitKinect(e.KinectRuntime)
ElseIf e.Status = KinectStatus.Disconnected Then
''切断されたとき
''一度すべてのImegeコントロールを初期化
Dim i As Integer
For i = 0 To Runtime.Kinects.Count
images(i).Source = Nothing
Next
''イベントハンドラの削除
RemoveHandler e.KinectRuntime.VideoFrameReady, AddressOf Kinect_VideoFrameReady
''KINECTの終了処理
e.KinectRuntime.Uninitialize()
End If
End Sub
Sub ShowKinectCount()
''接続されている台数を確認
kinectCount.Text = Runtime.Kinects.Count & "台のKINECTが有効です"
End Sub
Sub Kinect_VideoFrameReady(ByVal sender As Object, ByVal e As ImageFrameReadyEventArgs)
''切断された瞬間は書き込まないようにする
If IsNothing(sender) = False And sender.InstanceIndex >= 0 Then
Dim source As PlanarImage = e.ImageFrame.Image
images(sender.InstanceIndex).Source = BitmapSource.Create(source.Width, source.Height, 96, 96, PixelFormats.Bgr32, Nothing, source.Bits, source.Width * source.BytesPerPixel)
End If
End Sub
End Class
--------------------------------------------------------------------------------
KINECTを1台しか持っていないので複数台接続してのチェックはできていません。
0台の状態での動作は大丈夫でした。
0 件のコメント:
コメントを投稿