レビュアーに選出いただき、zigsow様及び日本マイクロソフト株式会社様に、御礼申し上げます。
今回、プログラム開発に使うマシンです。
・CPU=インテル Core i7-3770K
・MB=インテル デスクトップ・ボード DZ77BH-55K
・メモリ=コルセア CMZ8GX3M2A1866C9(4GB x 2、1866MHz, 9-10-9-27)
・SSD=Samsung SSD830 128GB x 2 (RAID0)
インテル SSD 320 120GB(ISRT用キャッシュ)
・HDD=日立 HDS721010CLA332(1TB/SATA3G/7200rpm/32MB) 画像(動画)保存用
・ディスプレイ=LG電子 IPS226
まず、届いた「Kinect for Windows センサー L6M-00005」から紹介していきます。
参照)
やってみよう!Kinectアプリ開発 - 第1回 Kinect(キネクト)の紹介
http://kinection.jp/post/3
箱から出してみた第一印象は、けっこう大きいという印象です。
左右についたマイクで位置を認識するのにこのくらいの大きさが必要だからでしょうか?
光学センサー部分だと12cmくらいに収まると思います。
センサー本体の影に隠れてしまいましたがACアダプタが付属しています。
すでにACアダプタは結線済みの状態で入っています。
中央が640x480のRGBカメラです。
左が3D深度センサー(赤外線投影)、右が3D深度センサー(赤外線受信)です。
左右にマイクのスリットがあります。
参照)
やってみよう!Kinectアプリ開発 - 第2回 開発環境のセットアップ
http://kinection.jp/post/30
を参考に開発環境を構築してみました。
「4.Kinectの接続」までは、KinectをUSBポートに接続しないでください。
■1.Visual Studio 2010のインストール
MSDNでダウンロードした「ja_visual_studio_2010_premium_x86_dvd_518796.iso」をインストールしました。
最新のSQL Server 2012を使うので、2008はインストールしないようにします。
以前は、Visual Studioに含まれていたCrystal Reportsをインストールします。
ダウンロードは以下のURLから行ってください。
http://www.businessobjects.com/jump/xi/crvs2010/default.asp
Windows Updateを行ってVisual Studio 2010 SP1を適応してください。
Visual Studio 2010起動確認を行いました。デフォルトの作業環境をC#に設定します。
■2.SQL Server 2012 Express
今回のプログラム開発でデータベースを使おうと思っているので最新のSQL Server 2012 Expressをインストールしました。
■3.KinectSDKとKinectDeveloperToolkitのインストール
以下のURLにアクセスして
http://www.microsoft.com/en-us/kinectforwindows/develop/d...
KinectSDK-v1.5-Setup.exe と KinectDeveloperToolkit-v1.5.0-Setup.exeをダウンロードします。
KinectSDK、KinectDeveloperToolkitの順にインストールします。
■4.Kinectの接続
KinectをUSBポートに接続します。
USB2.0ポートでもUSB 3.0ポートでも問題なく認識できました。
■5.Kinectの動作確認
「やってみよう!Kinectアプリ開発 - 第2回 開発環境のセットアップ」に従い動作チェックを行います。
・[Developer Toolkit Browser v1.5.0]を起動します。
・骨格認識「Skelton Basics-WPF」のRunを実行します。
子供に立ってもらいキャプチャしました。
・深度情報「Depth Basics-WPF」のInstallを実行します。
サンプルプログラムが保存されるので、Visual Studioで開きます。
ビルドを行い、デバックで実行させました。
テーブル、椅子とスタンドを映してみました。
以上により、だいたい開発環境が整いました。
■6.その他(SpeechPlatformSDKとインテルQuick Sync Video)
・SpeechPlatformSDK
ネットで調べたところ、 日本語の音声認識と音声合成を行うためには、
SpeechPlatformSDKが必要とのことなのでインストールしました。
http://www.microsoft.com/en-us/download/details.aspx?id=2...
で「MicrosoftSpeechPlatformSDK.msi」を
http://www.microsoft.com/en-us/download/details.aspx?id=2...
で「MSSpeech_SR_ja-JP_TELE.msi」と「MSSpeech_TTS_ja-JP_Haruka.msi」を
ダウンロードしてインストールします。
・Intel Media SDK 2012
今回のプログラム開発では、「インテル Quick Sync Video」を動画処理に使おうと思っているので、インストールしました。
http://software.intel.com/en-us/articles/vcsource-tools-m...
から「w_MSDK-2012_pu_3.0.015_R2.zip」をダウンロードしてインストールします。
●「やってみよう!Kinectアプリ開発 - 第3回 カメラの利用」にしたがってソースコードを入力します。
http://kinection.jp/post/44
Visual Studioで新規プロジェクトを選び、
C# WPFアプリケーションのテンプレートを選択します。
Kinectを参照に追加します。
※インデント部分は全角スペースを利用しています。ソースを利用するさい、TABに変換した上で利用願います。
■「MainWindow.xaml」
<Window x:Class="KinectCameraSample.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" Loaded="WindowLoaded" Closing="WindowClosing">
<Grid>
<Image Name="rgbImage" />
</Grid>
</Window>
■「MainWindow.xaml.cs」
エラー処理と終了処理が抜けていたので、骨格認識「Skelton Basics-WPF」のサンプルを
参考に追加してみました。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Microsoft.Kinect;
using System.IO; // ★追加
namespace KinectCameraSample
{
/// <summary>
/// MainWindow.xaml の相互作用ロジック
/// </summary>
public partial class MainWindow : Window
{
// Kinectセンサーからの画像情報を受け取るバッファ
private byte[] pixelBuffer = null;
// 画面に表示するビットマップ
private WriteableBitmap bmpBuffer = null;
//Kinectセンサー ★移動
private KinectSensor kinect = null;
public MainWindow()
{
InitializeComponent();
}
// 初期化処理(Kinectセンサーやバッファ類の初期化)
private void WindowLoaded(object sender, RoutedEventArgs e)
{
try
{
// Kinectセンサーの取得(エラー処理、ちょっと追加版)
foreach (var potentialSensor in KinectSensor.KinectSensors)
{
if (potentialSensor.Status == KinectStatus.Connected)
{
kinect = potentialSensor;
break;
}
}
if (kinect == null)
{
MessageBox.Show("Kinectが接続されていません。");
this.Close(); // ウインドウのクローズ
return;
}
// カラーストリームの有効化
kinect.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30);
// バッファの初期化
pixelBuffer = new byte[kinect.ColorStream.FramePixelDataLength];
bmpBuffer = new WriteableBitmap(kinect.ColorStream.FrameWidth,
kinect.ColorStream.FrameHeight,
96, 96, PixelFormats.Bgr32, null);
rgbImage.Source = bmpBuffer;
// イベントハンドラの登録
kinect.ColorFrameReady += ColorImageReady;
// Kinectセンサーからのストリーム取得を開始
try
{
kinect.Start();
}
catch (IOException)
{
kinect = null;
MessageBox.Show("Kinectが開始できません。");
this.Close(); // ウインドウのクローズ
return;
}
}
catch (Exception ex) // その他のエラー
{
MessageBox.Show("その他エラー:"+ ex.Message);
this.Close(); // ウインドウのクローズ
return;
}
}
// ColorFrameReady イベントのハンドラ(画像情報を取得して描画)
private void ColorImageReady(object sender, ColorImageFrameReadyEventArgs e)
{
using (ColorImageFrame imageFrame = e.OpenColorImageFrame())
{
if (imageFrame != null)
{
// 画像情報の幅・高さ取得 ※途中で変わらない想定!
int frmWidth = imageFrame.Width;
int frmHeight = imageFrame.Height;
// 画像情報をバッファにコピー
imageFrame.CopyPixelDataTo(pixelBuffer);
// ビットマップに描画
Int32Rect src = new Int32Rect(0, 0, frmWidth, frmHeight);
bmpBuffer.WritePixels(src, pixelBuffer, frmWidth * 4, 0);
}
}
}
// 終了処理
private void WindowClosing(object sender, System.ComponentModel.CancelEventArgs e)
{
if (kinect != null)
{
try
{
kinect.Stop();
}
catch
{
}
}
}
}
}
●チルト(エレベータ)機能の追加
チルト(エレベータ)を制御するスライダーを追加してみました。
■「MainWindow.xaml」
<Window x:Class="KinectCameraSample.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" Loaded="WindowLoaded" Closing="WindowClosing">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="25"/>
<RowDefinition />
</Grid.RowDefinitions>
<Slider Height="23" Name="sliderElevationAngle" Width="200" Grid.Row="0" ValueChanged="ChangeElevationAngle" />
<Image Name="rgbImage" Stretch="Fill" Grid.Row="1" />
</Grid>
</Window>
■「MainWindow.xaml.cs」
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Microsoft.Kinect;
using System.IO;
namespace KinectCameraSample
{
/// <summary>
/// MainWindow.xaml の相互作用ロジック
/// </summary>
public partial class MainWindow : Window
{
// Kinectセンサーからの画像情報を受け取るバッファ
private byte[] pixelBuffer = null;
// 画面に表示するビットマップ
private WriteableBitmap bmpBuffer = null;
// Kinectセンサー
private KinectSensor kinect = null;
// ElevationAngl待避
private double dblElevationAngle = 0;
public MainWindow()
{
InitializeComponent();
}
// 初期化処理(Kinectセンサーやバッファ類の初期化)
private void WindowLoaded(object sender, RoutedEventArgs e)
{
try
{
// Kinectセンサーの取得(エラー処理、ちょっと追加版)
foreach (var potentialSensor in KinectSensor.KinectSensors)
{
if (potentialSensor.Status == KinectStatus.Connected)
{
kinect = potentialSensor;
break;
}
}
if (kinect == null)
{
MessageBox.Show("Kinectが接続されていません。");
this.Close(); // ウインドウのクローズ
return;
}
// カラーストリームの有効化
kinect.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30);
// バッファの初期化
pixelBuffer = new byte[kinect.ColorStream.FramePixelDataLength];
bmpBuffer = new WriteableBitmap(kinect.ColorStream.FrameWidth,
kinect.ColorStream.FrameHeight,
96, 96, PixelFormats.Bgr32, null);
rgbImage.Source = bmpBuffer;
// イベントハンドラの登録
kinect.ColorFrameReady += ColorImageReady;
// Kinectセンサーからのストリーム取得を開始
try
{
kinect.Start();
}
catch (IOException)
{
kinect = null;
MessageBox.Show("Kinectが開始できません。");
this.Close(); // ウインドウのクローズ
return;
}
// チルト設定
sliderElevationAngle.Minimum = kinect.MinElevationAngle;
sliderElevationAngle.Maximum = kinect.MaxElevationAngle;
sliderElevationAngle.Value = kinect.ElevationAngle;
dblElevationAngle = sliderElevationAngle.Value;
}
catch (Exception ex) // その他のエラー
{
MessageBox.Show("その他エラー:"+ ex.Message);
this.Close(); // ウインドウのクローズ
return;
}
}
// ColorFrameReady イベントのハンドラ(画像情報を取得して描画)
private void ColorImageReady(object sender, ColorImageFrameReadyEventArgs e)
{
using (ColorImageFrame imageFrame = e.OpenColorImageFrame())
{
if (imageFrame != null)
{
// 画像情報の幅・高さ取得 ※途中で変わらない想定!
int frmWidth = imageFrame.Width;
int frmHeight = imageFrame.Height;
// 画像情報をバッファにコピー
imageFrame.CopyPixelDataTo(pixelBuffer);
// ビットマップに描画
Int32Rect src = new Int32Rect(0, 0, frmWidth, frmHeight);
bmpBuffer.WritePixels(src, pixelBuffer, frmWidth * 4, 0);
}
}
}
// 終了処理
private void WindowClosing(object sender, System.ComponentModel.CancelEventArgs e)
{
if (kinect != null)
{
try
{
kinect.Stop();
}
catch
{
}
}
}
private void ChangeElevationAngle(object sender, RoutedPropertyChangedEventArgs<double> e)
{
if (kinect != null)
{
try
{
kinect.ElevationAngle = (int)sliderElevationAngle.Value;
dblElevationAngle = sliderElevationAngle.Value;
}
catch (Exception ex)
{
sliderElevationAngle.Value = dblElevationAngle;
}
}
}
}
}
■動作
スライダー:左がdown、右がupになります。
対面用に作られているので、普通にカメラとして使うと右左が逆になっています。
・イベントハンドラ ChangeElevationAngle()の説明補足
エレベータが動作中に、更にエレベータ角度指定を行うとエラーになるのでtry, catchを入れてあります。
★★★1回目レビューまとめ★★★
今回は、RGBカメラを使うところまででしたので、Webカメラ止まりの機能しかわかりませんでした。
次回のKinect独自機能が待ち遠しいです。
★★★静止画キャプチャ機能を追加しました。★★★
スライダーでJPGで保存する品質を指定します。左が最低、右が最高品質になります。
ソースはこちらから
フォルダー選択ダイアログボックスのために
Windows API Code Pack for Microsoft .NET Frameworkを利用しています。
http://archive.msdn.microsoft.com/WindowsAPICodePack
からダウンロードしてください。
ZIGSOWにログインするとコメントやこのアイテムを持っているユーザー全員に質問できます。