2012-06-02

測試 AIR-Kinect

跟朋友借了 Kinect 偵測器用以 survey Adobe AIR 的應用。

朋友當初買的是 Xbox + Kinect 整組, 所以沒有附電源線 ( 電源+AUX-USB轉接 )。若是單買 Kinect     會附電源線。網路上電源線大概 360 NT, 原廠的大概 800 NT, 我直接跑去光華買, 問了好幾家才問到一家有賣, 還開價 450 NT, 想說懶得等就直接買了 QQ。

目前在 Windows 上測試還滿容易的, 先到 Kinect for windows 下載並安裝 SDK, Toolkit 應該可以不用安裝 (另一種方式是使用 OpenNI, 但我一直在 windows 7 32-bit 上裝不起來, 就不想試了)。

裝好 Kinect for Windows SDK 之後, 到 as3NUI 下載 airkinect-2-core, 並解壓縮。其中 bin/airkinect-2-core.swc 和 bin/airkinect-2-core-mssdk.ane 是我們會用到的兩個檔案。

as3NUI 建議使用 Flash Builder 4.6 (或其它 IDE ) 去開發, 在這兒有 Video 教學。以下是使用 Flash CS6 來測試的個人步驟:

  1. 建立一個專案目錄 kinect_01/ 。
  2. 以 Flash CS6 新建 AIR 檔案 kt_main01.fla 並存放在 kinect_01/ 裡。
  3. 將 airkinect-2-core.swc 和 airkinect-2-core-mssdk.ane 兩個檔案放到 kinect_01/ 裡。
  4. 在 kt_main01.fla 的「ActionScript設定」裡, 分別於「元件庫設定」加入 .swc 和 .ane 檔。
  5. 發佈時使用「Windows 安裝程式」不能使用「AIR套件」發佈。

以下程式參考 as3NUI 的範例,但寫在 fla 的第一影格:
import com.as3nui.nativeExtensions.air.kinect.Kinect;
import com.as3nui.nativeExtensions.air.kinect.KinectSettings;
import com.as3nui.nativeExtensions.air.kinect.events.CameraImageEvent;
import com.as3nui.nativeExtensions.air.kinect.data.User;
import com.as3nui.nativeExtensions.air.kinect.data.SkeletonJoint;
import com.as3nui.nativeExtensions.air.kinect.constants.CameraResolution;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.display.Bitmap;
import flash.display.Sprite;
import flash.events.Event;
import flash.display.Graphics;

var kinect:Kinect;
var kinectSettings:KinectSettings;
var bmp:Bitmap;
var skeletonContainer:Sprite;

stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.nativeWindow.visible = true;

if(Kinect.isSupported()){
 bmp = new Bitmap;
 this.addChild( bmp );
 skeletonContainer = new Sprite;
 this.addChild( skeletonContainer );
 kinect = Kinect.getDevice();
 kinect.addEventListener(CameraImageEvent.DEPTH_IMAGE_UPDATE, depthImageUpdate);
 kinectSettings = new KinectSettings();
 kinectSettings.depthEnabled = true;
 kinectSettings.skeletonEnabled = true;
 kinectSettings.depthResolution = CameraResolution.RESOLUTION_640_480;
 kinect.start( kinectSettings );
 this.addEventListener(Event.ENTER_FRAME, myEnterFrame);
} else {
 trace('Kinect is not Supported!');
}

function myEnterFrame(event:Event):void {
 var user:User;
 var joint:SkeletonJoint;
 var gr:Graphics = skeletonContainer.graphics;
 gr.clear();
 for each( user in kinect.usersWithSkeleton) {
  joint = user.rightHand;
  gr.beginFill(0xFF0000);
  gr.drawCircle(joint.depthPosition.x, joint.depthPosition.y, 10);
  gr.endFill();
  joint = user.leftHand;
  gr.beginFill(0x0000FF);
  gr.drawCircle(joint.depthPosition.x, joint.depthPosition.y, 10);
  gr.endFill();
 }
}

function depthImageUpdate(event:CameraImageEvent):void {
 bmp.bitmapData = event.imageData;
}


FB 留言