2011年12月12日月曜日

KINECT SDK VBでカラーイメージを表示


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

kaorun55氏のC#+WPFを参考にVB+WPFに変更しました。
基本となるRGB画像を表示します。

いきなりソースコードから

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="518" Width="665">
    <Grid>
        <Image Height="480"  Name="kinectImage"  Width="640" />
    </Grid>
</Window>
----------------------------------------------------------------------------

画面についてはImageコントロールのNameプロパティだけ注意すれば特に問題はないですね。


予め、メニューの「プロジェクト」->「参照の追加」->「.NET」タブから「Microsoft.Reseach.Kinect」を追加するようにしましょう。(C#だとソリューションエクスプローラーに「参照設定」が表示されるのにVBにはないんですよね。なぜなのかな?)



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

Class MainWindow
    Inherits Window

    Public nui As Runtime

    Public Sub New()

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

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

        'KINECTの確認
        If Runtime.Kinects.Count > 0 Then
            nui = Runtime.Kinects(0)
        Else
            MsgBox("KINECTが接続されていません。")
            Exit Sub
        End If

    End Sub

    Private Sub Window_Loaded(sender As System.Object,  e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded

        ''KINECT初期化
        nui.Initialize(RuntimeOptions.UseColor)

        ''Videoデータの取得
        nui.VideoStream.Open(ImageStreamType.Video, 2, ImageResolution.Resolution640x480, ImageType.Color)

        ''イベントハンドルの追加
        AddHandler nui.VideoFrameReady, AddressOf kinect_VideoFrameReady

    End Sub

    Private Sub kinect_VideoFrameReady(ByVal sender As Object, ByVal e As ImageFrameReadyEventArgs)

        Dim image As PlanarImage = e.ImageFrame.Image

        ''ImageコントロールにVideoストリームを割り当て
        kinectImage.Source = BitmapSource.Create(image.Width, image.Height, 96, 96, PixelFormats.Bgr32, Nothing, image.Bits, image.Width * image.BytesPerPixel)

        'リソース不足でエラーが出るので強制的にGC
        System.GC.Collect()

    End Sub

End Class
----------------------------------------------------------------------------


処理の大まかな流れは

1.初期化とKINECTの確認
2.Window表示
3.KINECT初期化
4.VideoStreamのオープン後、1フレームごとにインベント呼び出し
5.ImageコントロールにVideoStreamデータを割り当て

となります。

内容についてはコメントを見てもらえれば何をしているのかはわかると思います。





0 件のコメント:

コメントを投稿