Intel Perceptual Computing SDK (PerC SDK)を使い機会があったので、備忘録的に使い方を纏めておきたいと思います。
ここに書いてあることは大体SDKのドキュメントのProgramming Guideを読めば書いてあります。じっくり学びたい方は
こちらをどうぞ。
また、この記事に書いてあることは私個人の理解に基づいているため、大いに間違っている可能性があります。もし間違いを発見した方は、そっとコメントして頂けると非常に助かります…(╹◡╹)
SDKの構成
PerC SDKを使うにあたって、モジュール、デバイス、セッションといった聞きなれない言葉が出てきます。
まずはこれらについて説明しておきたいと思います。
PerC SDKの中には顔認識、ジェスチャー認識などの機能を持った複数の
モジュールと、ジェスチャーカメラなどのハードウェア抽象化して管理する複数の
デバイスが存在しています。
PerC SDKでは、すべてのデバイスとモジュールはSDKの中に隠蔽されており、ユーザーアプリケーションはそれらを直接扱うことはできず、全ての操作はSDK Interfaceを通して行われます。この時、デバイスやアルゴリズムを複数のアプリケーションで共有するため、アプリケーションとSDK Interfaceの間の処理を管理を
セッションによって行なっています。
PerC SDKを使う際には、
- まず対話のためのセッションを取得し
- モジュールの実体化とデバイスの取得を行い
- それらを接続
してから処理を開始する必要があります。
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();
で画像とジェスチャーを取得することができます。