ラベル VB の投稿を表示しています。 すべての投稿を表示
ラベル VB の投稿を表示しています。 すべての投稿を表示

2013年8月2日金曜日

LeapMotion サンプル その1 (WPF+VB)

KINECTよりすごい(かも)と言われているLeapMotionを手に入れました。
2013/7/22に一般発売でしたが、21日に注文して27日には到着しましたので比較手に入手はしやすいようです。

さて、LeapMotionで何ができるのかと簡単に説明するとセンサー上の手指の位置や移動の情報を高精度で取得できるガジェットです。

開発環境はC++,C#,JAVA,Javascript,Python等色々あります。OSはWindows7以降,MacOS X等(Linuxはまだβ版ドライバ)です。

SDKも一通り揃っているので、開発しやすいと思います。

ただ、SDK内のサンプルプログラムはWPF向けではないので、VB(開発環境には載っていないけれども.NetFramework3.5以降対応なので問題なし)+WPFのサンプルプログラムを作ってみました。

内容は指一本をセンサー上で動かすとCanvas上のポインター(Ellipse)が指先と同じように動きます。
LeapMotionはSDK上に仮想スクリーンを生成する機能を持っているので、それを利用しています。

早速コードをと行きたいところですが、まずは開発環境を整えましょう。

環境についてはこちらのブログを参照するのが早いと思います。

Natural Software
 http://www.naturalsoftware.jp/blog/8389

C#向けですが、VBも同じです。C++とかMacでの環境設定の説明もあるので他の記事も参考になると思います。

それではプログラムコードです。

まずはXAMLのソースです。画面構成はテキストボックスを4つと、Canvasを1つ配置しています。
Canvasのサイズは適当に変えても大丈夫です。

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="900" Width="1228">
    <Grid>
        <Canvas Name="Canvas1" Height="800" Width="1200" Margin="10,50,82,19"/>
        <TextBox Name="textbox1" HorizontalAlignment="Left" Height="23" Margin="85,10,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="80"/>
        <TextBox x:Name="textbox2" HorizontalAlignment="Left" Height="23" Margin="245,10,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="80"/>
        <TextBox x:Name="textbox3" HorizontalAlignment="Left" Height="23" Margin="358,10,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="80"/>
        <TextBox x:Name="textbox4" HorizontalAlignment="Left" Height="23" Margin="470,10,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="80"/>
        <Label Content="Frame ID:" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Width="70"/>
        <Label Content="Finger ID:" HorizontalAlignment="Left" Margin="170,10,0,0" VerticalAlignment="Top"/>
        <Label Content="X:" HorizontalAlignment="Left" Margin="330,10,0,0" VerticalAlignment="Top"/>
        <Label Content="Y:" HorizontalAlignment="Left" Margin="443,10,0,0" VerticalAlignment="Top"/>
    </Grid>
</Window>

次にプログラムコードです。
MainWindow.xaml.vb

Imports Leap
Class MainWindow
    Private leap As New Controller
    Private windowWidth As Integer = 1200       ''仮想スクリーンの幅
    Private windowHeight As Integer = 800       ''仮想スクリーンの高さ
    Public Sub New()
        ' この呼び出しはデザイナーで必要です。
        InitializeComponent()
        ' InitializeComponent() 呼び出しの後で初期化を追加します。
        ''イベント登録
        AddHandler CompositionTarget.Rendering, AddressOf UpdateFrame
    End Sub
    Private Sub UpdateFrame(sender As Object, e As EventArgs)
        Dim frame As Leap.Frame = leap.Frame
        Dim finger As Finger = frame.Fingers.Frontmost                      ''一番センサーに近い指を選択
        Dim stabilizedPosition As Vector = finger.StabilizedTipPosition
        Dim iBox As InteractionBox = leap.Frame.InteractionBox
        Dim normalizedPosition As Vector = iBox.NormalizePoint(stabilizedPosition)
        Dim x As Double = normalizedPosition.x * windowWidth
        Dim y As Double = windowHeight - normalizedPosition.y * windowHeight
        ''テキストボックスに各情報をセット
        textbox1.Text = frame.Id
        textbox2.Text = finger.Id
        textbox3.Text = CInt(x)
        textbox4.Text = CInt(y)
        ''Canvasのクリア
        Canvas1.Children.Clear()
        ''指を認識していないときは何もしない
        If finger.Id = -1 Then
        Else
            Dim el As New Ellipse
            Canvas1.Children.Add(el)
            With el
                .Margin = New Thickness(CInt(x), CInt(y), 0, 0)
                .Fill = New SolidColorBrush(Colors.Green)
                .Width = 10
                .Height = 10
            End With
        End If
    End Sub
End Class



WPFを使う場合に問題になるのが、要素の書き換え(この場合はCanvas)とセンサーからのデータ取得を同一スレッドで行う必要があることになります。

今回はCompositionTarget.Renderingイベントに合わせて、センサーからデータを取得しています。
CompositionTarget.RenderingはWPFの描画プロセス中に発生するイベントです。

プログラム内の描画ルーチン(UpdateFrame)は最低限のことしかしていません。本来であれば指先をロストした時の処理なども必要になると思います。(なので指先がセンサーの認識範囲外に移動するとポインターが暴れます。)

次はこのプログラムにタッチエミュレーションを加えてみようと思います。


2012年9月4日火曜日

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

音声認識サンプルのVB版になります。
基本的にC#版と同じですが、チルト制御の代わりに音声合成ができるようにしてみました。

音声合成のために「http://www.microsoft.com/en-us/download/details.aspx?id=27224」から「MSSpeech_TTS_ja-JP_Haruka.msi」をダウンロードしてインストールしてください。

続いてサンプルプログラムです。


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="350" Width="525">
    <Grid>
        <TextBox Height="66" HorizontalAlignment="Left" Margin="12,94,0,0" Name="textBox1" VerticalAlignment="Top" Width="479" FontSize="40" Text="" TextAlignment="Center" />
        <TextBox Height="24" HorizontalAlignment="Left" Margin="148,193,0,0" Name="textBox2" VerticalAlignment="Top" Width="195" TextAlignment="Center" />      
    </Grid>
</Window>


------------------------------------------------------------------------------
C#版と同じ内容です。テキストボックスを2つ配置しています。



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


Imports Microsoft.Kinect
Imports Microsoft.Speech.AudioFormat
Imports Microsoft.Speech.Recognition
Imports Microsoft.Speech.Synthesis
Imports System.IO
Imports System.Media


Class MainWindow
    Inherits Window

    Private kinect As KinectSensor
    Private audio As KinectAudioSource
    Private sre As SpeechRecognitionEngine
    Private voice As SpeechSynthesizer
    Private player As SoundPlayer

    Const sreName As String = "SR_MS_ja-JP_Kinect_11.0"

    ''' <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の初期化
        kinect = KinectSensor.KinectSensors(0)

        ''認識エンジンの初期化
        sre = New SpeechRecognitionEngine(sreName)

        ''音声合成エンジンの初期化
        voice = New SpeechSynthesizer

        ''音声再生用
        player = New SoundPlayer

        ''認識させたい単語
        Dim word As Choices = New Choices

        With word
            .Add("おはよう")
            .Add("こんにちは")
            .Add("こんばんは")
            .Add("キネクト")
            .Add("終わり")
            .Add("STOP")
            .Add("START")
        End With

        ''グラマービルダーの設定
        Dim gb As GrammarBuilder = New GrammarBuilder
        ''言語を認識エンジンに合わせる
        gb.Culture = sre.RecognizerInfo.Culture

        ''単語を登録
        gb.Append(word)

        ''グラマーの準備
        Dim g As Grammar = New Grammar(gb)

        ''認識エンジンにグラマーを登録
        sre.LoadGrammar(g)

        ''イベントの登録
        ''音声認識用
        AddHandler sre.SpeechRecognized, AddressOf sre_SpeechRecognized
        AddHandler sre.SpeechRecognitionRejected, AddressOf sre_SpeechRecognitionRejected

        ''音声合成用
        AddHandler voice.SpeakCompleted, AddressOf voice_SpeakCompleted

        ''KINECTの開始
        kinect.Start()

        ''KINECTのマイク設定
        audio = kinect.AudioSource
        audio.AutomaticGainControlEnabled = False
        audio.EchoCancellationMode = EchoCancellationMode.None

        ''音声入力の開始
        Dim s As Stream = audio.Start()
        ''入力フォーマットの設定
        Dim speechAudioFormat As SpeechAudioFormatInfo = New SpeechAudioFormatInfo(EncodingFormat.Pcm,
                                                                                 16000,
                                                                                 16,
                                                                                 1,
                                                                                 32000,
                                                                                 2,
                                                                                 Nothing)

        ''認識エンジンに入力ストリームとフォーマットを指定
        sre.SetInputToAudioStream(s, speechAudioFormat)

        ''音声認識開始(非同期、複数認識で)
        sre.RecognizeAsync(RecognizeMode.Multiple)

    End Sub

    Sub sre_SpeechRecognitionRejected(ByVal sender As Object, ByVal e As SpeechRecognitionRejectedEventArgs)

        textBox1.Text = "認識できません。"

    End Sub

    Sub sre_SpeechRecognized(ByVal sender As Object, ByVal e As SpeechRecognizedEventArgs)

        ''認識信頼度が0.7以上の時認識したと判断する
        If e.Result.Confidence >= 0.7 Then

            ''音声合成の準備
            player.Stream = New MemoryStream()
            voice.SetOutputToWaveStream(player.Stream)

            ''音声の合成(内部でWAVデータとしている)
            voice.SpeakAsync(e.Result.Text & " を認識しました")

            ''結果の表示
            textBox1.Text = e.Result.Text
            textBox2.Text = e.Result.Confidence.ToString()

        End If
    End Sub

    Sub voice_SpeakCompleted(ByVal sender As Object, ByVal e As SpeakCompletedEventArgs)

        ''WAVデータを最初から再生
        player.Stream.Position = 0
        player.Play()

    End Sub

    Private Sub Window_Closed(sender As System.Object, e As System.EventArgs) Handles MyBase.Closed

        If kinect Is Nothing = False Then
            If kinect.IsRunning = True Then
                kinect.Stop()
                sre.RecognizeAsyncStop()
                kinect.Dispose()
            End If
        End If
    End Sub
End Class
------------------------------------------------------------------------------

赤字の部分は音声合成を利用するための記述になります。
音声認識の部分はC#版と同じです。コメントを読めば何をしているのか理解できるかと思います。

認識できた言葉に応じて自動応答ができるようにもなりますね。

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っぽく見えるはずです。


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イメージをそのまま表示することはほとんどないでしょうが、データ構造を理解するのには知っておく必要があるのではないかと思います。

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

2012年8月26日日曜日

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

KINECTのサンプル VB版です。

C#と同じ内容です。

開発環境は

Windows7 Ultimate 64bit SP1
Visual Basic 2010 Express
KINECT SDK 1.5
KINECT for Windows

となります。

WPFアプリケーションです。

プロジェクトの参照の追加で「Microsoft.Kinect」を追加するようにしてください。


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="Rgb" Stretch="Uniform" Height="480" Width="640" />
    </Grid>
</Window>
------------------------------------------------------------------------------

C#とまったく同じです。イメージコントロールを1つ配置しています。


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

Class MainWindow

    Inherits Window

    Private kinect As KinectSensor
    Private colorPixel As Byte()

    ''' <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)

        ''RGBデータ用配列の初期化
        colorPixel = New Byte(kinect.ColorStream.FramePixelDataLength - 1) {}

        ''RGBカメラの設定
        kinect.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30)

        ''イベントの登録
        AddHandler kinect.ColorFrameReady, AddressOf kinect_colorFrameReady

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

    End Sub

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

        Using colorFrame As ColorImageFrame = e.OpenColorImageFrame
            If colorFrame Is Nothing = False Then

                colorFrame.CopyPixelDataTo(colorPixel)

                Rgb.Source = BitmapSource.Create(colorFrame.Width, colorFrame.Height, 96, 96, PixelFormats.Bgr32, Nothing, colorPixel, colorFrame.Width * colorFrame.BytesPerPixel)

            End If
        End Using

    End Sub
End Class
------------------------------------------------------------------------------

C#と比べてほとんど違いはありません。NullがNothingになるのをよく間違えますけど^^;

画像データを生成している箇所の説明を少しします。
イメージコントロールのソースを「BitmapSource.Create」で行っていますが、構文は

BitmapSource.Create( 
               画像の幅、
               画像の高さ、
               表示するDPIのX値(通常は96に固定)、
               表示するDPIのY値(通常は96に固定)、
               ビットマップのピクセル形式(BGR32が推奨?)、
               ビットマップのパレット(使わない?)、
               ビットマップを表すバイト配列(KINECTのRGBデータ)、
               ストライド(ビットマップの幅×1ピクセル当りのバイト数 32ビットなので4バイト)
               )

となります。

KINECTからのRGBデータ(バイト配列)を加工することによっていろいろな画像表示が可能になります。