Kinect v2のカメラから画像を取り込んで表示する基本プログラム

2014年9月10日(水)
薬師寺 国安

参照設定

ソリューションエクスプローラー内の「参照設定」に、Microsoft.Kinect.dllを追加する必要があります。この手順については第1回で解説していますので、そちらを参照してください。

ロジックコードを記述する

次に、ソリューションエクスプローラー内のMainWindow.xamlを展開して表示される、MainWindow.xaml.vbをダブルクリックしてリスト2のコードを記述します。

リスト2 メンバー変数の宣言など(MainWindow.xaml.vbの一部)

Imports Microsoft.Kinect   (1)
Class MainWindow
    Private myKinect As KinectSensor   (2)
    Private myColorFrameReader As ColorFrameReader = Nothing   (3)
    Private colorBitmap As WriteableBitmap = Nothing   (4)
    Private ColorImagePixelData As Byte()   (5)
    Private BytesPerPixel As Integer = 4 ‘CInt(PixelFormats.Bgr32.BitsPerPixel / 8)   (6)
  1. Kinectの使用を可能にするために、Microsoft.Kinect名前空間をインポートします。次は、メンバー変数を宣言します。
  2. Kinectセンサーを表すクラスであるKinectSensor型のメンバー変数myKinectを宣言します。
  3. カラーフレームリーダーを表すクラスであるColorFrameReader型のメンバー変数myColorFrameReaderを宣言します。
  4. WriteableBitmapクラス型のメンバー変数colorBitmapを宣言します。WriteableBitmapは、書き込みおよび更新が可能なBitmapSource を提供するクラスで、BitmapSourceは単一の一定なピクセルセットを、特定のサイズおよび解像度で表わすクラスを意味します。
  5. バイト型の配列であるメンバー変数ColorImagePixelDataを宣言します。6. Integer型のメンバー変数BytePerPixelを宣言し、「4」で初期化しておきます。この「4」という値は、32ビットフルカラーのRGB形式で、先頭から1バイト(8ビット)ずつ「青」、「緑」、「赤」の情報が入っており、各カラーチャネルに割り当てられる「bits per pixel(BPP)」が「8」のため、Bgr32を「8」で除算した「4」バイトを意味します。「青」、「緑」、「赤」では24ビットしか使用されませんが、残りの8ビットは「Alpha(不透明度)」に使用されることが多いです。「4」という直接的な値ではなく

    CInt(PixelFormats.Bgr32.BitsPerPixel / 8)

    と記述しても同じです。

ウインドウが読み込まれた時の処理

続いて、ウインドウが読み込まれた際の処理です。

リスト3 ウインドウが読み込まれた時の処理(MainWindow.xaml.vbの一部、リスト2の続き)

    Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
        myKinect = KinectSensor.GetDefault   (1)
        If myKinect Is Nothing = False Then
            myColorFrameReader = myKinect.ColorFrameSource.OpenReader(2)
            Dim myColorFrameDescripton As FrameDescription = myKinect.ColorFrameSource.CreateFrameDescription(ColorImageFormat.Bgra)   (3)
            ColorImagePixelData = New Byte(myColorFrameDescripton.Width * myColorFrameDescripton.Height * BytesPerPixel - 1) {}
            colorBitmap = New WriteableBitmap(myColorFrameDescripton.Width, myColorFrameDescripton.Height, 96.0, 96.0, PixelFormats.Bgr32, Nothing)  (4)
            AddHandler myColorFrameReader.FrameArrived, AddressOf myColorFrameReader_FrameArrived   (5)
            myKinect.Open()   (6)
        End If
    End Sub
  1. 最初に、Kinectセンサーを使用可能にします。Kinectセンサーが使用可能な状態にある場合は、以下の処理を行います。
  2. カラーフレームのソースを取得する、ColorFrameSourceのOpenReaderメソッドで、カラーフレームのソースフレームのリーダーを開きます。
  3. KinectSensorからのイメージフレームのプロパティを表わすクラスである、FrameDescriptionクラス型の変数myColorFrameDescriptionを宣言し、ColorFrameSource.CreateFrameDesciptionメソッドで、指定した形式のColorFrameのFrameDescription オブジェクトを作成します。この場合は、ColorImageFormatが「Bgra形式」のFrameDescriptionオブジェクトを作成します。簡単にいうと、「BGRA形式」のカラー画像の情報を作成することになります。次にバイト配列を作成します。
  4. 指定したパラメーターを使用して、WriteableBitmapのインスタンスを作成します。WriteableBitmapの書式は下記の通りです。

    WriteableBitmap(pixelWidth,pixelHeight,dpiX,dpiY,pixelFormat,palette)

    「dpiX」は「ビットマップの水平ドット/インチ」を、「dpiY」は「ビットマップの垂直ドット/インチ」を表します。通常は両方とも「96.0」を指定します。「PixelFormat」には「Bgr32」を指定し、「palette」には「Nothing」と指定しておきます。「PixelFormats.Bgr32」は、「Bgr32ピクセル形式」を取得します。 「Bgr32」は、ピクセルあたりのビット数 (BPP) が「32」の「sRGB 形式」です。 各カラーチャネル (青、緑、および赤) に割り当てられるピクセルあたりのビット数 (BPP) は「8」になります。
  5. AddHandlerステートメントで、ColorFrameReaderのFrameArrivedイベントに、イベントハンドラを指定します。FrameArrivedイベントは、カラーフレームが到着した時に発生するイベントです。
  6. OpenメソッドでKinectセンサーを開きます。
  • Kinect v2のカメラから画像を取り込むサンプル

    『速攻攻略!Kinect v2』 第2回のサンプルプログラムです。
薬師寺国安事務所

薬師寺国安事務所代表。Visual Basic プログラミングと、マイクロソフト系の技術をテーマとした、書籍や記事の執筆を行う。
1950年生まれ。事務系のサラリーマンだった40歳から趣味でプログラミングを始め、1996年より独学でActiveXに取り組む。1997年に薬師寺聖とコラボレーション・ユニット PROJECT KySS を結成。2003年よりフリーになり、PROJECT KySS の活動に本格的に参加、.NETやRIAに関する書籍や記事を多数執筆する傍ら、受託案件のプログラミングも手掛ける。Windows Phoneアプリ開発を経て、現在はWindows ストア アプリを多数公開中

Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。Microsoft MVP for Development Platforms - Windows Phone Development(Oct 2012-Sep 2013)。Microsoft MVP for Development Platforms - Client Development(Oct 2013-Sep 2014)。Microsoft MVP for Development Platforms-Windows Platform Development (Oct 2014-Sep 2015)。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています