[Kinect SDK] 建立支援Kinect的WPF應用程式(二) - 嫌麻煩嗎?那就偷懶吧!!

  • 40275
  • 0
  • C#
  • 2013-07-15

在上一篇文章中跟大家介紹了透過Kinect SDK取得攝影機擷取到的畫面的方式。雖然沒寫多少程式碼,不過,可能會有朋友覺得只是要拿個畫面而已,就得做這麼多事、寫這麼多程式是一件很累人的工作....(好吧,其實是我自己懶)
所以今天就要來介紹幾個可以加速開發的第三方元件,Let's Rock!!

 

在上一篇文章中跟大家介紹了透過Kinect SDK取得攝影機擷取到的畫面的方式。雖然沒寫多少程式碼,不過,可能會有朋友覺得只是要拿個畫面而已,就得做這麼多事、寫這麼多程式是一件很累人的工作....(好吧,其實是我自己懶害羞)

所以今天就要來介紹幾個可以加速開發的第三方元件,Let's Rock!!

 

Visual Studio 2010 Templates

覺得每次要建立Kinect專案都得手動加入參考和加入Namespace的Using是很麻煩又很浪費時間的一件事嗎?那就安裝現成的專案樣版吧!!

在CodePlex上可以找得到KinectContrib這個專案,裡面就包含了for Visual Studio 2010的專案樣版,可以讓我們簡單的就建立好加入參考而且寫好Namespace引用的專案,方便吧!?

跟我一樣懶的朋友們可以直接下載執行檔來進行安裝,比較吃苦耐勞的朋友就可以下載ZIP檔來自行安裝。

執行檔執行的畫面如下:

image

選取Visual Studio 2010專案樣版所在的資料夾,如果沒修改過Visual Studio 2010中專案樣版的路徑的話,使用預設值即可。

image

開始功能表中的資料夾設定,可以在這邊設定在開始功能表中要建立的資料夾名稱;如果不想建立資料夾,勾選下方的「Don't create a Start Menu folder」即可。

image

按下Install按鈕後就會開始安裝啦~~

image

安裝完畢!!!

image

噹噹!!!新的專案樣版出現!!

image

專案建立好之後直接按下F5~哇!!有沒有這麼貼心啊!!連程式都幫我們寫好了!!真是太方便啦!!!

image

 

Coding4Fun Kinect Toolkit

只是要拿到拍攝到的畫面再把它存下來,除了像上一篇文章這樣乖乖的的把ImageFrame轉來轉去,寫一大串落落長的程式,最後轉成BitmapSource嗎?

不想要只是為了拿到圖片就得寫落落長程式的朋友們有福了!!!透過Coding4Fun Kinect Toolkit,就可以玩轉所有Kinect SDK中擷取到的的視訊畫面!!

讓我們拿上一次的文章來使用Coding4Fun Kinect Toolkit來簡化看看~

首先在專案中加入Coding4Fun.Kinect.Wpf.dll的引用

image

接著修改MainWindow.xaml.cs的內容:

MainWindow.xaml.cs
using System;
using System.IO;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using Microsoft.Research.Kinect.Nui;

//在專案中加入Coding4Fun.Kinect.Wpf命名空間的引用
using Coding4Fun.Kinect.Wpf;

namespace Wpf_KinectSample
{
    public partial class MainWindow : Window
    {
        private Runtime _runtime;

        public MainWindow()
        {
            InitializeComponent();

            InitializeRuntime();
        }

        private void InitializeRuntime()
        {
            UninitializeRuntime();

            _runtime = new Runtime();

            //因為我們只要取得基本的鏡頭拍到的畫面而已,所以只需要將RuntimeOptions設定為UseColor即可
            _runtime.Initialize( RuntimeOptions.UseColor );

            //透過VideoStream.Open方法開始取得視訊串流
            _runtime.VideoStream.Open( ImageStreamType.Video , 2 , ImageResolution.Resolution640x480 , ImageType.Color );

            //替VideoFrameReady加入EventHandler,把畫面畫在Image中。
            _runtime.VideoFrameReady += new EventHandler<ImageFrameReadyEventArgs>( RuntimeVideoFrameReady );
        }

        private void UninitializeRuntime()
        {
            if( _runtime == null )
            {
                return;
            }

            _runtime.VideoFrameReady -= RuntimeVideoFrameReady;

            _runtime.Uninitialize();

            _runtime = null;
        }

        private void RuntimeVideoFrameReady( object sender , ImageFrameReadyEventArgs e )
        {
            //沒錯,只要一行!!
            imgVideoFrame.Source = e.ImageFrame.ToBitmapSource();
        }

        private void btnStart_Click( object sender , RoutedEventArgs e )
        {
            InitializeRuntime();
        }

        private void btnStop_Click( object sender , RoutedEventArgs e )
        {
            UninitializeRuntime();
        }

        private void btnSavePicture_Click( object sender , RoutedEventArgs e )
        {
            Microsoft.Win32.SaveFileDialog openFileDialog = new Microsoft.Win32.SaveFileDialog();
            openFileDialog.FileName = "MyImage"; 
            openFileDialog.DefaultExt = ".jpg"; 
            openFileDialog.Filter = "Jpeg Image (.jpg)|*.jpg"; 

            Nullable<bool> result = openFileDialog.ShowDialog();


            string fileName = string.Empty;

            if( result == true )
            {
                fileName = openFileDialog.FileName;
            }
            else
            {
                return;
            }

            //這邊也是一行搞定~
            ( imgVideoFrame.Source as BitmapSource ).Save( fileName , ImageFormat.Jpeg );
        }
    }
}

更簡單了吧!!

 

Kinect Toolkit

什麼!? 上面的Coding4Fun看起來就像是寫好玩的!? I服了You!! 要懶就來懶到底吧~ 直接搬正牌的Kinect Toolkit來助陣總行了吧?

不過可別小看這個元件庫,它可不只能處理圖片喔!!它可是連基本的手勢偵測和一些姿勢偵測功能都包含進去了呢!!(不過我還是得大材小用的拿它來示範視訊畫面的擷取~害羞)

首先一樣在專案中加入Kinect.Toolkit.dll的引用

image

再來修改上面的程式碼:

MainWindow.xaml.cs
using System;
using System.IO;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using Microsoft.Research.Kinect.Nui;

using Coding4Fun.Kinect.Wpf;

//在專案中加入Kinect.Toolkit命名空間的引用
using Kinect.Toolkit;

namespace Wpf_KinectSample
{
    public partial class MainWindow : Window
    {
        private Runtime _runtime;

        //在Kinect.Toolkit中有一個ColorStreamManager可以幫助我們取得一般的視訊畫面
        private ColorStreamManager _colorStreamManager;

        public MainWindow()
        {
            InitializeComponent();

            InitializeRuntime();
        }

        private void InitializeRuntime()
        {
            UninitializeRuntime();

            _runtime = new Runtime();

            //在建立Runtime 的Instance的同時,也順便建立ColorStreamManager的Instance
            _colorStreamManager = new ColorStreamManager();

            //因為我們只要取得基本的鏡頭拍到的畫面而已,所以只需要將RuntimeOptions設定為UseColor即可
            _runtime.Initialize( RuntimeOptions.UseColor );

            //透過VideoStream.Open方法開始取得視訊串流
            _runtime.VideoStream.Open( ImageStreamType.Video , 2 , ImageResolution.Resolution640x480 , ImageType.Color );

            //替VideoFrameReady加入EventHandler,把畫面畫在Image中。
            _runtime.VideoFrameReady += new EventHandler<ImageFrameReadyEventArgs>( RuntimeVideoFrameReady );
        }

        private void UninitializeRuntime()
        {
            if( _runtime == null )
            {
                return;
            }

            _runtime.VideoFrameReady -= RuntimeVideoFrameReady;

            _runtime.Uninitialize();

            _colorStreamManager = null;

            _runtime = null;
        }

        private void RuntimeVideoFrameReady( object sender , ImageFrameReadyEventArgs e )
        {
            //透過ColorStreamManager.Update()方法,直接傳入ImageFrameReadyEventArgs,取得BitmapSource
            imgVideoFrame.Source = _colorStreamManager.Update( e );

            
        }

        private void btnStart_Click( object sender , RoutedEventArgs e )
        {
            InitializeRuntime();
        }

        private void btnStop_Click( object sender , RoutedEventArgs e )
        {
            UninitializeRuntime();
        }

        private void btnSavePicture_Click( object sender , RoutedEventArgs e )
        {
            Microsoft.Win32.SaveFileDialog openFileDialog = new Microsoft.Win32.SaveFileDialog();
            openFileDialog.FileName = "MyImage"; 
            openFileDialog.DefaultExt = ".jpg"; 
            openFileDialog.Filter = "Jpeg Image (.jpg)|*.jpg"; 

            Nullable<bool> result = openFileDialog.ShowDialog();


            string fileName = string.Empty;

            if( result == true )
            {
                fileName = openFileDialog.FileName;
            }
            else
            {
                return;
            }

            //要儲存圖片的話,就可以搭配Coding4Func提供的Save()擴充方法,會比較方便喔!!
            ( _colorStreamManager.ColorBitmap as BitmapSource ).Save( fileName , ImageFormat.Jpeg );
        }
    }
}

 

以上,今天的分享就到這邊啦!!

 

最後一樣奉上專案原始碼,請自行取用: