2012年8月29日水曜日

KINECTサンプル(VB) Depthカメラ for SDK1.5

Depthサンプルの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="520" Width="700">
    <Grid>
        <Image Name="DepthImg" Stretch="Uniform" Height="480" Width="640" />
    </Grid>
</Window>
------------------------------------------------------------------------------

イメージコントロールを1つ配置しています。

MainWindow.xaml.vb
------------------------------------------------------------------------------
Imports Microsoft.Kinect

Class MainWindow

    Inherits Window

    Private kinect As KinectSensor
    Private colorPixel As Byte()
    Private depthPixel As Short()

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

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

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

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

    End Sub

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub Window_Loaded(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded

        kinect = KinectSensor.KinectSensors(0)

        ''Depthカメラの設定
        kinect.DepthStream.Enable(DepthImageFormat.Resolution640x480Fps30)

        ''データ用配列の準備
        colorPixel = New Byte(kinect.DepthStream.FramePixelDataLength * 4 - 1) {}
        depthPixel = New Short(kinect.DepthStream.FramePixelDataLength - 1) {}

        ''イベントの登録
        AddHandler kinect.DepthFrameReady, AddressOf kinect_depthFrameReady

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

    End Sub

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

        Using depthFrame As DepthImageFrame = e.OpenDepthImageFrame
            If depthFrame Is Nothing = False Then
                ''Depthカメラのデータを取得
                depthFrame.CopyPixelDataTo(depthPixel)

                ''距離データから画像を生成
                Dim i As Integer
                Dim j As Integer = 0
                Dim depth As Short
                Dim dist As Byte
                For i = 0 To depthPixel.Length - 1

                    ''距離データの取り出し
                    depth = CShort(depthPixel(i) >> DepthImageFrame.PlayerIndexBitmaskWidth)

                    ''画素データに変換 SDKのサンプルを参照
                    dist = CByte((depth + 1) And Byte.MaxValue)

                    ''距離データを100分率で表現
                    ''dist = CByte(255 - (255 * depth / 4095))

                    ''//距離データ 13ビットを4ビットシフトしてから8ビット分だけ取り出す場合
                    ''dist = CByte((depth + 1) >> 4 And Byte.MaxValue)

                    ''RGBイメージに書込み
                    colorPixel(j) = dist
                    colorPixel(j + 1) = dist
                    colorPixel(j + 2) = dist
                    j = j + 4

                Next

                DepthImg.Source = BitmapSource.Create(depthFrame.Width, depthFrame.Height, 96, 96, PixelFormats.Bgr32, Nothing, colorPixel, depthFrame.Width * 4)

            End If
        End Using
    End Sub
End Class
------------------------------------------------------------------------------

C#版とは違いはありません。
Depthイメージをそのまま表示することはほとんどないでしょうが、データ構造を理解するのには知っておく必要があるのではないかと思います。

次は骨格認識の予定です。

0 件のコメント:

コメントを投稿