レビューメディア「ジグソー」

静止画キャプチャ機能を追加しました。

この度は、「kinection.jp:やってみようKinect(キネクト)アプリ開発 - ラボクルー集まれ!」の
レビュアーに選出いただき、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のインストール
Visual Studio 2010
Visual Studio 2010

MSDNでダウンロードした「ja_visual_studio_2010_premium_x86_dvd_518796.iso」をインストールしました。
Visual Studio 2010
Visual Studio 2010

最新のSQL Server 2012を使うので、2008はインストールしないようにします。
Crystal Reports
Crystal Reports

以前は、Visual Studioに含まれていたCrystal Reportsをインストールします。
ダウンロードは以下のURLから行ってください。
http://www.businessobjects.com/jump/xi/crvs2010/default.asp

Windows Updateを行ってVisual Studio 2010 SP1を適応してください。

Visual Studio 2010起動確認
Visual Studio 2010起動確認

Visual Studio 2010起動確認を行いました。デフォルトの作業環境をC#に設定します。

■2.SQL Server 2012 Express
SQL Server 2012 Express
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の順にインストールします。
KinectSDK
KinectSDK

KinectDeveloperToolkit
KinectDeveloperToolkit


■4.Kinectの接続
KinectをUSBポートに接続します。
USB2.0ポートでもUSB 3.0ポートでも問題なく認識できました。



■5.Kinectの動作確認
「やってみよう!Kinectアプリ開発 - 第2回 開発環境のセットアップ」に従い動作チェックを行います。

・[Developer Toolkit Browser v1.5.0]を起動します。
動作確認 1
動作確認 1


・骨格認識「Skelton Basics-WPF」のRunを実行します。
動作確認 2
動作確認 2

 子供に立ってもらいキャプチャしました。

・深度情報「Depth Basics-WPF」のInstallを実行します。
 サンプルプログラムが保存されるので、Visual Studioで開きます。
 ビルドを行い、デバックで実行させました。
動作確認 3
動作確認 3

 テーブル、椅子とスタンドを映してみました。

動作確認 4
動作確認 4


以上により、だいたい開発環境が整いました。

■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」をダウンロードしてインストールします。
IntelMedia SDK 1
IntelMedia SDK 1

Intel Media SDK 2
Intel Media SDK 2

Intel MediaSDK動作確認
Intel MediaSDK動作確認



●「やってみよう!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になります。
対面用に作られているので、普通にカメラとして使うと右左が逆になっています。

エレベータ Up
エレベータ Up

エレベータ Down
エレベータ Down


・イベントハンドラ ChangeElevationAngle()の説明補足
エレベータが動作中に、更にエレベータ角度指定を行うとエラーになるのでtry, catchを入れてあります。

★★★1回目レビューまとめ★★★
今回は、RGBカメラを使うところまででしたので、Webカメラ止まりの機能しかわかりませんでした。
次回のKinect独自機能が待ち遠しいです。

★★★静止画キャプチャ機能を追加しました。★★★
JPG
JPG

 スライダーでJPGで保存する品質を指定します。左が最低、右が最高品質になります。
PNG
PNG


ソースはこちらから

フォルダー選択ダイアログボックスのために
Windows API Code Pack for Microsoft .NET Frameworkを利用しています。
http://archive.msdn.microsoft.com/WindowsAPICodePack
からダウンロードしてください。

21人がこのレビューをCOOLしました!

コメント (0)

ZIGSOWにログインするとコメントやこのアイテムを持っているユーザー全員に質問できます。

YouTube の動画を挿入

YouTube の URL または動画の ID を入力してください

動画の ID が取得できません。ID もしくは URL を正しく入力してください。

ニコニコ動画の動画を挿入

ニコニコ動画の URL または動画の ID を入力してください

動画の ID が取得できません。ID もしくは URL を正しく入力してください。

ZIGSOWリンク挿入

検索対象とキーワードを入力してください

    外部リンクを挿入

    リンク先の URL とタイトルを入力してください

    URL を正しく入力してください。

    画像を挿入(最大サイズ20MB)

    画像を選択してください

    ファイルサイズが20MBを超えています

    別の画像を追加

    ほかのユーザーのレビュー

    ZIGSOW にログイン

    ZIGSOW会員登録(無料)はこちらから