Kinectプログラミングの練習として、カメラ画像を表示するプログラムを動かしてみます。
環境は Windows7 SP1 と Visual Studio 2013、
言語は C#、WPF アプリケーションです。
大まかな処理の流れは以下の通り。
・Kinect の初期化と開始処理
・カメラ画像の取得とフレーム表示処理
・Kinect の終了処理
準備として、プロジェクトの参照に「Microsoft.Kinect」を追加します。
また、今回はフレーム表示にて Coding4FunToolkit のメソッドを使用しているのでこちらも予め用意します。
using Microsoft.Kinect;
using Coding4Fun.Kinect.Wpf;
##Kinect の初期化と開始処理
KinectSensor kinect;
kinect.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30);
kinect.ColorFrameReady += ColorFrame;
ColorStream.Enable でカメラを有効にし、ColorFrameReady でフレーム表示のイベントを設定します。
カメラ有効の際には ColorImageFormat で解像度とフレームレートが指定できます。
RGBタイプの場合、解像度を 1280×960 にすることもできますが、フレームレートは 12fps に下がります。
kinect.Start();
これで動作を開始します。
##カメラ画像の取得とフレーム表示処理
ColorImageFrame Frame = e.OpenColorImageFrame();
Color.Source = Frame.ToBitmapSource();
OpenColorImageFrame() で画像データを取得し、ToBitmapSource() でビットマップ画像への変換を行います。
変換したものを Color に格納し、XAMLフォームの Imageタグで呼び出しています。
なお、ToBitmapSource() は先述の Coding4FunのToolkit で追加されているメソッドです。
BitmapSource.Create を利用する例などがありましたが、簡単だったのでこちらを利用してみました。
また、本当はフレームデータのメモリリークや null のチェックなどが必要となるようなのですが、、、ここでは省いてしまっています。
##Kinect の終了処理
if (kinect.IsRunning)
{
kinect.Stop();
}
Kinect が動作している状態から、Stop() により処理を停止します。
ここのメソッド名と XAMLフォームの Closing属性が対応しており、ウインドウを閉じたときに呼び出される処理となります。
##プログラム
最終的に、以下の通りとなりました。
これだけで一応動作はするものの、先ほどのメモリリークの件など大切な処理が所々足りないですね。
まだまだ理解しなければならないことは多いですが、とりあえずこんなに簡単に動かせたよということで……
####XMALフォーム部【MainWindow.xaml】
<Window x:Class="Kinect_Color.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="480" Width="640" Closing="ColorClose">
<Grid>
<Image Name="Color" />
</Grid>
</Window>
####ロジック部【MainWindow.xaml.cs】
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
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 Coding4Fun.Kinect.Wpf;
namespace Kinect_Color
{
/// <summary>
/// MainWindow.xaml の相互作用ロジック
/// </summary>
public partial class MainWindow : Window
{
KinectSensor kinect;
public MainWindow()
{
InitializeComponent();
if (KinectSensor.KinectSensors.Count == 0)
{
MessageBox.Show("Kinectを接続してください");
}
kinect = KinectSensor.KinectSensors[0];
kinect.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30);
kinect.ColorFrameReady += ColorFrame;
try
{
kinect.Start();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
void ColorFrame(object sender, ColorImageFrameReadyEventArgs e)
{
try
{
ColorImageFrame Frame = e.OpenColorImageFrame();
Color.Source = Frame.ToBitmapSource();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
void ColorClose(object sender, System.ComponentModel.CancelEventArgs e)
{
if (kinect.IsRunning)
{
kinect.Stop();
}
}
}
}
次は深度の取得を行ってみます。