2011年12月17日土曜日

KINECT SDK 挿抜状態検出サンプル

このエントリはKINECT SDK Advent Calendar : ATNDの12月17日分です。

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 件のコメント:

コメントを投稿