Kinect v2のジェスチャーでBing Mapsを未来的に直感操作する

2015年1月14日(水)
薬師寺 国安

Microsoft HTTP Client Librariesのインストール

WPFではデフォルトではHttpClientクラス(System.Net.Http名前空間)が使用できません。そこで、NuGetから必要なライブラリーをインストールします。

「NuGet パッケージの管理」ダイアログの検索欄に「Microsoft HTTP Client」と入力すると、「Microsoft HTTP Client Libraries」が表示されるので、「インストール」をクリックします(図8)。

「Microsoft HTTP Client Libraries」をインストールする

図8:「Microsoft HTTP Client Libraries」をインストールする(クリックして拡大)

Microsoft ASP.NET Web API Client Librariesのインストール

これも同様の手順で「Microsoft ASP.NET Web API Client Libraries」を検索し、「Microsoft ASP.NET Web API 2.2 Client Libraries」をインストールします(図9)

「Microsoft ASP.NET Web API 2.2 Client Libraries」をインストールする

図9:「Microsoft ASP.NET Web API 2.2 Client Libraries」をインストールする(クリックして拡大)

プログラムコード

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

名前空間の読み込みとメンバー変数の宣言

リスト2:MainWindow.xaml.vbの一部

Imports Microsoft.Maps.MapControl.WPF   (1)
Imports System.Net.Http   (2)
Imports Microsoft.Kinect
Imports System.ComponentModel
Class MainWindow
    Private myKinect As KinectSensor
    Private myBodyFrameReader As BodyFrameReader
    Private myBodies As Body()

    Private myHandPositionX As Double
    Private myHandPositionY As Double
    Private myColorSpacePoint As ColorSpacePoint   (3)
    Private MyBytesPerPixel As Integer = 4

    Private myColorFrameReader As ColorFrameReader = Nothing
    Private colorBitmap As WriteableBitmap = Nothing
    Private ColorImagePixelData As Byte()
    Private BytesPerPixel As Integer = 4
    Private commonJoint As Joint   (4)
    Private point As DepthSpacePoint   (5)
    Private Index As Integer = 0
    Private no As Integer = 0

ほとんどが連載の第2回と同じですので、ここでは新しく登場するものを中心に解説しておきます。

  1. Bing Mapsの各プロパティやメソッドの含まれる、「Microsoft.Maps.MapControl.WPF」名前空間を読み込みます。
  2. HTTP 属性のクラスが含まれるSystem.Net.Http名前空間を読み込みます。
  3. カラー空間における2Dの位置を表す構造体のメンバー変数myColorSpacePointを宣言します。
  4. 身体の関節の位置を表すJoint構造体のメンバー変数、commonJointを宣言します。
  5. 距離空間における2Dの位置を表す構造体のメンバー変数pointを宣言します。

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

リスト3:MainWindow.xaml.vbの一部(リスト2の続き)

Private Async Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
    Dim client As New HttpClient   (1)
    Dim myPin As New Pushpin   (2)
    Dim myAddress As String = "愛媛県松山市道後"   (3)
    Dim addressUri = String.Format("http://www.geocoding.jp/api/?v=1.1&q={0}", myAddress) (4)
    Dim myResponse = Await client.GetStringAsync(New Uri(addressUri, UriKind.Absolute))  (5)
    Dim doc = XElement.Parse(myResponse)   (6)
    Dim myAddressLatitude = doc.Descendants("coordinate").Elements("lat").Value  (7)
    Dim myAddressLongitude = doc.Descendants("coordinate").Elements("lng").Value
    Dim myLabel As New Label   (8)
    With myLabel
        .Content = myAddress
        .Foreground = New SolidColorBrush(Colors.Navy)    (9)
        .Background = New SolidColorBrush(Colors.Beige)
        .FontSize = 20
    End With

    Dim myLocation As New Location   (10)
    myLocation.Latitude = myAddressLatitude   (11)
    myLocation.Longitude = myAddressLongitude
    myPin.Location = New Location(myAddressLatitude, myAddressLongitude) (12)
    MapLayer.SetPosition(myLabel, myLocation)   (13)

    myMap.SetView(myLocation, 16)   (14)
    myMap.Children.Add(myPin)   (15)
    myMap.Children.Add(myLabel)

    myKinect = KinectSensor.GetDefault   (16)
    If myKinect Is Nothing = False Then   (17)
        Dim myDepthDescription = myKinect.DepthFrameSource.FrameDescription  (18)
        myKinect.Open()   (19)
        myBodyFrameReader = myKinect.BodyFrameSource.OpenReader  (20)
        AddHandler myBodyFrameReader.FrameArrived, AddressOf myBodyFrameReader_FrameArrived  (21)
        myBodies = New Body(myKinect.BodyFrameSource.BodyCount - 1) {} (22)
        myColorFrameReader = myKinect.ColorFrameSource.OpenReader (23)
        Dim myColorFrameDescription As FrameDescription = myKinect.ColorFrameSource.CreateFrameDescription(ColorImageFormat.Bgra)  (24)
        ColorImagePixelData = New Byte(myColorFrameDescription.Width * myColorFrameDescription.Height * BytesPerPixel - 1) {}  (25)
        colorBitmap = New WriteableBitmap(myColorFrameDescription.Width, myColorFrameDescription.Height, 96.0, 96.0, PixelFormats.Bgr32, Nothing)  (26)
    End If
End Sub
  1. HttpClientのインスタンスclientオブジェクトを作成します。
  2. PushPinクラスのインスタンスmyPinオブジェクトを作成します。
  3. 変数myAddressに「愛媛県松山市道後」と指定します。
  4. 変数addressUriにGeocodingのWeb APIを使用して、住所を指定してリクエストを作成します。
    詳細については、Geocoding Web APIのサイトを参照してください。
  5. 指定したURIにGET要求を送信し、非同期操作で応答本体を文字列として返すGetStringAsyncメソッドに変数myAddressを指定し、返される結果XMLを変数myResponseに格納します。
  6. XElement.Parseメソッドで返されたmyResponseの内容を、文字列として読み込みます。
  7. 読み込んだXMLから、coordinate要素のlatの値を変数myAddressLatitudeに、lngの値を変数myAddressLongitudeに格納します。
  8. 新しいLabelのインスタンスmyLabelオブジェクトを作成します。
  9. ContentプロパティにmyAddress変数の値を指定し、文字色にNavy、背景色にBeige、文字サイズに20を指定します。
  10. 新しいLocationのインスタンスmyLocationオブジェクトを作成します。
  11. LatitudeとLongitudeの両プロパティに、それぞれ変数myAddressLatitude、myAddressLongitudeの値を指定します。
  12. PushPinの位置を変数myAddressLatitudeとmyAddressLongitudeの位置に指定します。
  13. MapLayerクラスのSetPositionメソッドで、マップレイヤー内にLabelの位置を設定します。
  14. SetViewメソッドで、指定された中心部に位置、ズーム レベル、方位、およびピッチにマップビューを設定します。この場合myLocationの位置に「16」レベルでズームインします。
  15. myMapにAddメソッドでピンとLabelを追加します。
  16. Kinectセンサーを使用可能にします。
  17. Kinectセンサーが使用可能な状態にある場合は、以下の処理を行います。
  18. 距離フレームプロパティの形式を取得し、変数myDepthDescriptionで参照します。
  19. Kinectを動作させます。
  20. BodyFrameSource.OpenReaderで、ボディ フレームのソース フレームのリーダーを作成し、変数myBodyFrameReaderで参照します。
  21. myBodyFrameReader.FrameArrivedで、新しいボディフレームの準備ができているときに発生するイベント処理を実行します。
  22. ボディフレームソースのボディの個数を引数に持った、新しいBodyの配列をmyBodiesに格納します。
  23. myKinect.ColorFrameSource.OpenReaderで、カラー フレームのソース フレームのリーダーを作成し、myColorFrameReaderメンバー変数で参照します。
  24. カラー画像の情報をBGRAフォーマットで作成し、変数myColorFrameDescriptionで参照します。
  25. 配列変数ColorImagePixelDataを確保します。
  26. ピクセル データを格納するビットマップを作成し、変数colorBitmapで参照します。

  • Kinect v2でBing Mapsを操作するプログラム

    『作りながら学ぶKinect v2プログラミング開発』 第5回のサンプルプログラムです。
薬師寺国安事務所

薬師寺国安事務所代表。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メルマガ会員のサービス内容を見る

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