Kinect v2 からUSBでつないだ機器をコントロールしてみよう Vol.1

Preview:

DESCRIPTION

Kinectを使うWindowsストアアプリの注意点を理解する カラーカメラの画像を画面に表示する 頭のボーンの位置をカメラ画像に合わせて表示する USB接続機器の操作ジェスチャーを判定する

Citation preview

Kinect v2 からUSBでつないだ機器をコントロールしてみよう

Vol.01 2014/11/14

本日のゴール

Kinectを使うWindowsストアアプリの注意点を理解する

カラーカメラの画像を画面に表示する

頭のボーンの位置をカメラ画像に合わせて表示する

USB接続機器の操作ジェスチャーを判定する

チェック

Microsoft Windows 8.1 (x64)

Visual Studio Community 2013

Kinect for Windows SDK v2.0http://www.microsoft.com/en-us/kinectforwindows/⇒[download]

KineMissile

不要なファイルの削除

3つのフォルダを作成

Models

ViewModels

Views

【Views】 画面定義などを記述

【ViewModels】複数のModelをまとめるなど

【Models】KinectやUSB機器と接続するコードを記述

ViewsフォルダにMainPage.xamlを作成

フォルダ右クリック[追加]-[新しい項目]

appmanifestの機能の設定

ここでビルド

コンパイルエラーの対応

コンパイルエラーの対応

MainPage

ソリューションエクスプローラープロジェクト名を右クリック⇒[追加]-[参照]

Kinect for Windows SDK v2への参照設定追加

メニューバーの[ビルド]-[構成マネージャー]

Kinect SDKはx64専用なので実行時はx64Visual Studioはx86専用なので編集時はx86

教材をコピー

フォルダ右クリック⇒[追加]-[既存の項目]

教材の2ファイルをそれぞれ所定のフォルダに追加

ここでビルド

<Grid.RowDefinitions>

<RowDefinition Height="140"/>

<RowDefinition Height="*"/></Grid.RowDefinitions>

<StackPanel Grid.Row="1">

<Grid>

<Viewbox Height="700" Width="1024">

<Image Source="{Binding ColorImageElement}" Stretch="UniformToFill" />

</Viewbox>

</Grid>

</StackPanel>

MainPage.xamlの編集

ここにコードを書く

こう書かれている部分を探す

<Grid.RowDefinitions>

<RowDefinition Height="140"/>

<RowDefinition Height="*"/></Grid.RowDefinitions>

<StackPanel Grid.Row="1">

<Grid>

<Viewbox Height="700" Width="1024">

<Image Source="{Binding ColorImageElement}" Stretch="UniformToFill" />

</Viewbox>

</Grid>

</StackPanel>

MainPage.xamlの編集

Private Model As New ViewModels.MainViewModel

Public Sub New()

InitializeComponent()

Me._navigationHelper = New Common.NavigationHelper(Me)

AddHandler Me._navigationHelper.LoadState, AddressOf NavigationHelper_LoadState

AddHandler Me._navigationHelper.SaveState, AddressOf NavigationHelper_SaveState

Me.DataContext = Me.Model

End Sub

Private Sub NavigationHelper_LoadState(sender As Object, e As Common.LoadStateEventArgs)

Me.Model.KinectConnect()

End Sub

Private Sub NavigationHelper_SaveState(sender As Object, e As Common.SaveStateEventArgs)

Me.Model.KinectDisConnect()

End Sub

MainPage.xaml.vbの編集

ここでビルド

Kinectをつないでみよう

ここで実行⇒カラーカメラの画像表示

<StackPanel Grid.Row="1">

<Grid>

<Viewbox Height="700" Width="1024"><Image Source="{Binding ColorImageElement}" Stretch="UniformToFill" />

</Viewbox>

<Viewbox Height="700" Width="1024">

<Canvas Name="BodyCanvas" Height="1080" Width="1920"

DataContext="{Binding BodyImageElement}">

<Rectangle Stroke="Red"

StrokeThickness="30" Width="200" Height="200"

Canvas.Top="{Binding Top}" Canvas.Left="{Binding Left}" />

</Canvas>

</Viewbox>

</Grid>

</StackPanel>

MainPage.xamlへの追加編集

頭部のボーンの取得コード例 (KinectModel.vb)

カラー画像とボーンでは座標系が違う

座標をカラー画像に合わせる⇒MapCameraPointToColorSpace

Dim headPos = Me.Kinect.CoordinateMapper.MapCameraPointToColorSpace(

born.Joints(JointType.Head).Position)

Me.BodyImageElement = New PosRect With {.Top = headPos.Y - 200 / 2,

.Left = headPos.X - 200 / 2}

ここで実行⇒画像の顔部分に赤い四角を表示

腕を振り下ろすと機器操作のコード例(KinectModel.vb)

If (born.Joints(JointType.HandLeft).Position.Y > born.Joints(JointType.Head).Position.Y) ThenMe.IsUp = True

ElseIf (born.Joints(JointType.HandLeft).Position.Y < born.Joints(JointType.Head).Position.Y + 10) ThenIf (Me.IsUp) Then

'ミサイル発射Me.IsUp = False

End IfEnd If