ページ

2013年8月4日日曜日

Intel Perceptual Computing SDK を C# から使う

Intel Perceptual Computing SDK (PerC SDK)を使い機会があったので、備忘録的に使い方を纏めておきたいと思います。
ここに書いてあることは大体SDKのドキュメントのProgramming Guideを読めば書いてあります。じっくり学びたい方はこちらをどうぞ。
また、この記事に書いてあることは私個人の理解に基づいているため、大いに間違っている可能性があります。もし間違いを発見した方は、そっとコメントして頂けると非常に助かります…(╹◡╹)

SDKの構成


PerC SDKを使うにあたって、モジュール、デバイス、セッションといった聞きなれない言葉が出てきます。
まずはこれらについて説明しておきたいと思います。

PerC SDKの中には顔認識、ジェスチャー認識などの機能を持った複数のモジュールと、ジェスチャーカメラなどのハードウェア抽象化して管理する複数のデバイスが存在しています。
PerC SDKでは、すべてのデバイスとモジュールはSDKの中に隠蔽されており、ユーザーアプリケーションはそれらを直接扱うことはできず、全ての操作はSDK Interfaceを通して行われます。この時、デバイスやアルゴリズムを複数のアプリケーションで共有するため、アプリケーションとSDK Interfaceの間の処理を管理をセッションによって行なっています。


PerC SDKを使う際には、

  1. まず対話のためのセッションを取得し
  2. モジュールの実体化とデバイスの取得を行い
  3. それらを接続
してから処理を開始する必要があります。

C#から使う

最近はC#にどっぷり浸かりきっていて、出来ればC#の世界から一歩も外に出たくありません。
幸い、PerC SDKにはC#のポートが存在するので、ありがたくこれを利用させていただきましょう。


C#のポートはlibpxcclr.dllという名前のマネージドDLLで、PerC SDKのインストールディレクトリのframwork/CSharpの中にソースが入っています。環境に合わせてビルドしましょう。

libpxcclr.dllがビルドできたらプロジェクトの参照に加えて、以下の手順で処理を行います。

1.セッションの作成

PXCMSession session;
PXCMSession.CreateInstance(out session);

2.モジュールとI/Oデバイスの作成

PXCMGesture gesture;
session.CreateImpl<PXCMGesture>(PXCMGesture.CUID, out gesture);

UtilMCapture capture = new UtilMCapture(session);

3.設定と接続

PXCMGesture.ProfileInfo pi;
gesture.queryProfile(0, out pi);
capture.LocateStreams(ref pi.inputs);
gesture.setProfile(ref pi);

4.実行

PXCMImage[] images = new  PXCMImage[PXCMCapture.VideoStream.STREAM_LIMIT];
PXCMScheduler.SyncPoint[] syncPoints = new PXCMScheduler.SyncPoint[2];

while(true)
{
    PXCMImage.Dispose(images);
    PXCMScheduler.SyncPoint.Dispose(sps);

    capture.ReadStreamAsync(images, out sps[0]);
    gesture.ProcessImageAsync(images, out sps[1]);
    PXCMScheduler.SyncPoint.SynchronizeEx(sps);

    //ここで表示などの処理
}
PXCMImage.Dispose(images);
PXCMScheduler.SyncPoint.Dispose(sps);
またこの際、セッション、モジュール、デバイスはそれぞれPerC SDK内のネイティブコードとつながっているので、使い終わったら必ずDisposeする必要があります。
可能な限りusingステートメント内で使用するようにしましょう。

--

[追記]
PerC SDKには、これらの処理を簡潔に行うための、パイプラインが用意されているそうです…
単純に深度画像とジェスチャーを取得するのみなら、
_pipeline = new UtilMPipeline();
_pipeline.QueryCapture().SetFilter(deviceName)
_pipeline.EnableGesture(moduleName);
_pipeline.Init();
で初期化して、
_pipeline.AcquireFrame(true)

var gesture = _pipeline.QueryGesture();
var depthImage = _pipeline.QueryImage(PXCMImage.ImageType.IMAGE_TYPE_DEPTH);

//何らかの処理

_pipeline.ReleaseFrame();
で画像とジェスチャーを取得することができます。

0 件のコメント:

コメントを投稿