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