ビジュアルジェスチャーBuilderのC ++ APIアプリケーションのウィンドウv2のジェスチャー認識ツールのためのKinect(プロテスト可能)

:への転載https://kheresy.wordpress.com/2015/09/04/vgb-cpp-api/

 

異端「の前にKinectのジェスチャー認識ライブラリーの確立:ビジュアルジェスチャーBuilderツール(A)」と「Kinectのジェスチャー認識ライブラリーの確立:ビジュアルジェスチャービルダー(2)」これら二つの記事は、VisualジェスチャーBuilderツールプログラムを持っています基本的な操作は、導入ある程度やっています。

そして、この一つは、それが内部に独自のC ++プログラムでも、ジェスチャーBuilderはC ++ APIを提供し、データベースの態度がジェスチャーを識別するために、視覚を通じて、自分を構築する方法について懸念しています。


ビジュアルジェスチャービルダーファイル

C ++のAPI内部のC ++プログラムで使用するVGB、それはVGBヘッダファイルを導入する必要があります、「Kinect.VisualGestureBuilder.h。」ヘッダファイルのファイルの場所や他のK4W SDKv2が下にある同じ場所「$(KINECTSDK20_DIR)\ INC。」

ビルドフェーズに必要なのlibファイルでは、それはまた、このフォルダの下に「$(KINECTSDK20_DIR)\ Libの」に位置して、「Kinect20.VisualGestureBuilder.lib」です。(x86およびx64は、内の異なるフォルダに配置されました)

必要なファイルが実行されると、それは、このフォルダの下に「$(KINECTSDK20_DIR)\のRedist \ VGB」です。フォルダ内の二つのDLLファイルは、この情報は、それぞれ、継続する必要があり、個別のジェスチャ検出;「Kinect20.VisualGestureBuilder.dll」このファイルが、また、このフォルダ内の「vgbtechs」を提出する必要があることに加えてC ++プログラムアルゴリズム実装。

 


VGBのC ++インタフェース

VGB C ++ APIを使用して、基本的には、含めて提供して六の大インターフェースを使用することになるとき:

前記、使用の姿勢のうちのデータベースファイル(.gba又は.gbd)によって読み取ら格納するために使用されIVisualGestureBuilderDatabaseは、唯一の初期化フェーズにおいて基本的な必要性が存在します。

そしてIVisualGestureBuilderFrameSource、IVisualGestureBuilderFrameReaderとIVisualGestureBuilderFrameこれらの3つは、それが3層アーキテクチャー・インターフェースのように、K4W SDK v2およびその他の情報です。

最後に、インタフェースIVisualGestureBuilderFrame結果、あなたはその後、それぞれの姿勢のために各ジェスチャーの検出結果として、IDiscreteGestureResult IContinuousGestureResultまたはカテゴリを撮影した姿勢に応じてすることができます。

ここでは詳細な説明を行うためにこれらのインタフェースに対する応答が、あります。

 


VGBリポジトリを読みます

あなたが姿勢を検出するために開始する前に、我々は最初のデータライブラリの読み込みを提起しなければならないので、VGB検出を使用した場合、内部のデータベースファイル(.gbaまたは.gbd)で開始する必要がある姿勢ので、情報に必要な姿勢を読みますアウト。

VGBのC ++ APIでは、あなたが通過する必要があります  )(CreateVisualGestureBuilderDatabaseInstanceFromFile  オブジェクトリポジトリの作成、ファイルの機能を読み取るためにIVisualGestureBuilderDatabaseを

一般的に、ここで書かれたプログラムは次のようになります。

sDatabaseFile = L「test.gbd」をwstringの、
IVisualGestureBuilderDatabase * pGestureDatabase = nullptr;
CreateVisualGestureBuilderDatabaseInstanceFromFile(
    sDatabaseFile.c_str()、&pGestureDatabase)。

「test.gbd」VGBツールによって生成されたデータベース・ファイル、およびオブジェクトのデータベース、pGestureDatabaseの確立を読むためにVGBを作ることです。この例では、。

pGestureDatabaseを確立した後、次のステップは、姿勢の内部情報を読み取るために、彼の機能部材を介してです。各姿勢へとなぜなら利用可能な位置の数を得るために複数の位置を含むことができるので、ここで第一get_AvailableGesturesCount(を通過しなければならないデータベース)この関数、次いでget_AvailableGesturesスルー()この関数、  IGesture  このタイプは、抽出されません。

ここでは基本的なプログラムは次のように書くことができます。

//データベースにどのように多くのジェスチャーを取得
= 0 UINT iGestureCount。
pGestureDatabase-> get_AvailableGesturesCount(&iGestureCount)。

 

//ジェスチャーのリストを取得
IGesture ** aGestureList =新しいIGesture * [iGestureCount]。
pGestureDatabase-> get_AvailableGestures(iGestureCount、aGestureList)。

前記、iGestureCountこの情報はpGestureDatabaseライブラリ、利用可能な姿勢の数であり、個々の動作姿勢(IGesture)アレイのaGestureList後に取り出されます。

しかし、実際のIGestureにこのタイプおよび他の目的は、直接検出に使用することはできませんが、唯一の彼の基本的な情報だけを読むことができます。あなたが彼の基本的な情報を読みたい場合は、次のように書くことができます。

GestureType MTYPE;
wchar_tのSNAME [260]。
以下のために(INT i = 0; I <iGestureCount; ++ I)
{
    IF(aGestureList [I] - > get_GestureType(&MTYPE)== S_OK)
    {
        IF(MTYPE == GestureType_Discrete)
            COUT <<「\ tの[D]「 ;
        それ以外の場合(MTYPE == GestureType_Continuous)
            はcout <<「\ tの[C]「;

 

        IF(aGestureList [I] - > get_Name(260、SNAME)== S_OK)
            wcout << SNAME << ENDL。
    }
}

それはここで見ることができ、姿勢のタイプはget_GestureTypeによって達成することができる()(離散または連続)、ジェスチャーの名前はget_Nameを介して取得することができます()。

しかし、ほとんどが小さな260よりネームストリング(SNAME)の長さを読み取るために使用される場合、時間異端自身のテストで発見され、ことに留意すべきである、リードの名前は失敗します。

もちろん、ここにもすべての機能VGB C ++ APIとSDK K4W V2はAPIであることに注意し、結果を返します。それが安全である、それが戻ってチェックされ、各機能を実行するのが最善です値がS_OKである場合があり、プログラムの正常な動作を保証するために、通過します。


VGBは、データの初期化を読み込みます

まあ、VGB後のライブラリに読み込んまた、データを読み取るため、姿勢を検出することができ、他の要素を使用する必要があります。

最初される前に、姿勢を検出するために使用されるVGBは、等IVisualGestureBuilderFrameSource VGBインターフェース、に加えて、提案のいくつかは"を参照することができるジョブプログラムに関連K4W SDK V2人体検知(IBodyFrameSource)必要K4W V2がC ++をパート7:検出、追跡人間の骨格」。

また、実際にはVGBの一部、および他の類似のフレームのソースを使用するように、通って最初に  CreateVisualGestureBuilderFrameSource()  IVisualGestureBuilderFrameReaderを得るために、このIVisualGestureBuilderFrameSourceオブジェクトを確立する機能、及びその後OpenReaderのIVisualGestureBuilderFrameSource(介して)この関数オブジェクト。

しかし、より具体的に、IVisualGestureBuilderFrameSourceオブジェクトが一つだけのオペレータに対応しているので、あなたは、複数の事業者が検出するための姿勢を取りたい場合は、より多くのジョブオブジェクトを生成する必要があります。

プログラムの側では、のように書くことができます。

IVisualGestureBuilderFrameSource **年齢teredソース=新しいIVisualGestureBuilderFrameSource * [iBodyCount]。
aGestureReaders IVisualGestureBuilderFrameReader ** =新しいIVisualGestureBuilderFrameReader * [iBodyCount]。
以下のために(INT i = 0; iはiBodyCountを<; ++ I)
{
    CreateVisualGestureBuilderFrameSource(pSensor、0、&年齢はtered源[I])。
    年齢tered源[I] - > AddGestures(iGestureCount、年齢teredリスト)。
    年齢tered源[I] - > [開くリーダー(&aGestureReaders [I]);
}

内部上記のコードでは、iBodyCountは、基本的には6であるべき、ヒトIBodyFrameSourceトラックの数です。

そして、ここで各姿勢検出、およびデータの読み出しの後に、IVisualGestureBuilderFrameSourceとIVisualGestureBuilderFrameReaderを確立している、可能な6人の体を狙っています。

その後、それは各IVisualGestureBuilderFrameSourceにもあるが、姿勢を検出するように設定されている。ここでget_AvailableGestures介してIGestureアレイ(aGestureList)この関数は、()それに全体のフィードを取得()使用AddGesturesあります。あなたはそれぞれの姿勢を検出しない場合、あなたはまた、AddGesture()この関数を使用し一つ一つを設定することができます。

ただし、必要に応じて実装に対応するVGBオブジェクトを確立している(とき検出された人物)もちろん、実際には、すべての潜在的なユーザーのために起動する必要はありませんが、これらの項目の設立に行く前に、ことも可能です資源の管理のようなので、ここで事前に構成されたこのような比較的単純な方法の使用について、比較的トラブルになります。


メインサークルに戻ってデータを読みます

プログラムは、初期化が完了している場合IVisualGestureBuilderFrameReaderは、つまり、()この関数は、新しいデータを取得するCalculateAndAcquireLatestFrameを提供し、他のデータ・タイプをIVisualGestureBuilderFrame介して、次のステップは、メインループ内であることがあります。

メインループ内では、すべての最初には、現在IBodyFrameReaderを通じて人間の体についての情報を持っているトラックに取得する必要があります。建築プログラムの側は、基本的には次のように書かれたことができます。

IBodyFrame * PFRAME = nullptr;
IF(pFrameReader-> AcquireLatestFrame(&PFRAME)== S_OK)
{
    (pFrame-> GetAndRefreshBodyData(iBodyCount、aBody)== S_OK)の場合
    {
        ため(INT i = 0; iはiBodyCountを<; ++ I)
        {
            IBody * pBody = aBody [i]は、

 

            BOOLEAN bTracked =偽;
            IF((pBody-> get_IsTracked(&bTracked)== S_OK)&& bTracked)
            {
                //プロセスボディ情報
            }
        }
    }
    pFrame->リリース()。
}

それは、新たなデータ(PFRAME)に読み出された後、次いでGetAndRefreshBodyData()は、内部情報aBody IBodyを更新することを介して、及び、各本体(pBody)のために、前に、もしあれば、追跡するためにそこにあるかどうかを確認します処理は(「//プロセス身体情報」コンテンツを実行するために)行くことを続けています。

あなたはVGBを使用する場合と、その後、ここで身体の追跡番号(トラッキングIDを)取りに行くする必要がある、と彼は人体検知のためのこの姿勢をやって行かせ、IVisualGestureBuilderFrameSourceに語りました。プログラムのこの部分は、以下のように書くことができます。

UINT64 uTrackingId = 0。
(pBody-> get_TrackingId(&uTrackingId)== S_OK)であれば
{
    UINT64 uGestureId = 0。
    IF(aGestureSources [I] - > get_TrackingId(&uGestureId)== S_OK)
    {
        IF(uGestureId = uTrackingId!)
            aGestureSources [I] - > put_TrackingId(uTrackingId)。
    }
}

ここで、基準電流設定(uGestureId)の対応IVisualGestureBuilderFrameSourceオブジェクト(aGestureSources [i])とIBody get_TrackingID()を介してボディ(uTrackingId)の数を得るために、まず、次に得ることで、二つの値がない場合同じ、代表)(put_TrackingIdを通して数を設定するには、この機能を必要とします。

それが完了したら、CalculateAndAcquireLatestFrameを通じて()この関数は、つまり、pGestureFrameに次のコードを新しいIVisualGestureBuilderFrameを取得することができます。

IVisualGestureBuilderFrame * pGestureFrame = nullptr;
IF(aGestureReaders [I] - > CalculateAndAcquireLatestFrame(&pGestureFrame)== S_OK)
{
    BOOLEAN bGestureTracked = FALSE;
    IF(pGestureFrame-> get_IsTrackingIdValid(&bGestureTracked)== S_OK && bGestureTracked)
    {
        ため(INT J = 0; J <iGestureCount; ++ j)は
        {
            //プロセスの各ジェスチャー
        }
    }
    pGestureFrame->リリース()。
}

内部に上記のコードでは、再び姿勢検出素子が現在存在していることが確認された成功したユーザにトレースしています。それは何の問題も決定されていない場合や、次のステップは、再び各姿勢のために、個々の取引を行うことです。

フロント述べたように、VGB姿勢は、データ型の検出結果をもたらすどちらも、2つの別個の、連続的存在は異なっています。離散ジェスチャ検出結果(IDiscreteGestureResult)は、主にブール変数になり、それが検出され、その後、彼の信頼性(信頼)を表す浮動小数点数が存在することを意味し、また、あなたはそれが最初であるかどうか、現時点で知ることができます画像が検出されると、連続ジェスチャ検出結果(IContinuousGestureResult)が現在の進行状況(進捗状況)を表す、一つだけ振幅点があるが、値を取得してください。

データ・タイプは、広く変化するので、結果は2つのタイプが別々に処理されなければならないからです。コードの側には、以下の形式で書くことができます。

//ジェスチャ情報取得
GestureType MTYPEを。
aGestureList [J] - > get_GestureType(&MTYPE)。

 

CONST UINT uTextLength = 260。
wchar_tのSNAME [uTextLength]。
aGestureList [J] - > get_Name(uTextLength、SNAME)。

(MTYPE == GestureType_Discrete)であれば
{
    IDiscreteGestureResult * pGestureResult = nullptr。
    (pGestureFrame-> get_DiscreteGestureResult(aGestureList [J]、&pGestureResult)== S_OK)であれば
    {
        偽BOOLEAN bDetected =。
        IF(pGestureResult-> get_Detected(&bDetected)== S_OK && bDetected)
        {
            フロートfConfidence =は0.0f。
            pGestureResult-> get_Confidence(&fConfidence)。
            wcout << L「検出されたジェスチャ「<< SNAME << L "@" << fConfidence <<てendl;
        }
        pGestureResult->リリース()。
    }
}
そうであれば(MTYPE == GestureType_Continuous)
{
    IContinuousGestureResult * pGestureResult = nullptr;
    IF(pGestureFrame-> get_ContinuousGestureResult(aGestureList [J]、&pGestureResult)== S_OK)
    {
        フロートfProgress =は0.0f。
        IF(pGestureResult-> get_Progress(&fProgress)== S_OK)
        {
            IF(fProgress> 0.5F)
                wcout << L「検出されたジェスチャ「<< SNAME << L」「<< fProgress << ENDL;
        }
        pGestureResult->リリース( );
    }
}

内部上記のコードでは、主に名前、ならびに、ジェスチャの種類を取得します。

それは離散的なジェスチャーをされている場合は、、、その後、get_DiscreteGestureResultのpGestureFrame()の結果の姿勢検出、pGestureResultを取得するには、この機能を使用することです。IDiscreteGestureResult自体は、これらの3つの関数は、検出の結果を読み取るために使用することができるget_Detectedを()、get_Confidence()、get_FirstFrameDetected()を提供します。

一般的には、まず、第1 get_Detectedスルー()他の情報を読み取り、この位置が検出されたかどうかを決定する、または他の処理を行います。対応するメッセージをプリントアウトするときが検出されたときに上記の例では、異端は、この位置に書き込まれます。

継続姿勢ならば、姿勢検出の結果を得るためにget_ContinuousGestureResult()この関数を使用します。情報はIContinuousGestureResultは基本的にシンプルな、唯一get_Progress()この機能を提供することができます。

なぜならジェスチャ検出の連続性、進捗状況の値が得られますので、あなたが継続姿勢を使用する場合、それは多くの問題だろう、それは離散的な位置で必要になることがあり、基本的であるだけで、特定の個別に設定されています型姿勢条件が唯一の治療の継続姿勢の下で検出され、このタイプのアプローチを通じて、基本的に順番に真に継続姿勢で対処するので、彼は実用的なアプリケーションを持っています。

異端はここで単純なプログラム例であるため、しかし、それは単に0.5以上、その上に印刷され、対応するメッセージの進行時間です。


手順VGB C ++ APIは、ここで整理して、基本的には、あなたが完全なサンプルコードを動作させることができ、異端を入れてご参照ください  GitHubの上のファイルを

このサンプル・プログラムは、基本的には、グラフィカルインターフェース、テキストのみのインターフェースではありません。実行後、第1姿勢をもたらすであろうデータベースが記載されているし、その後検出を開始され、姿勢が検出された場合、それは出力印刷に関する情報をあろう。

あなたはそれを注意する必要があり、いくつかのものがあります。

  • その独自のデータベースファイルを使用する場合、テストを行い、あなたが対応する変更を加える必要があり、そうでなければ、それは読んでいないだろう。姿勢データベースファイルを読み込むには死んで、ファイル名が「test.gbd」であるコードで書かれています情報。
  • ランタイムDLLに加えて、プログラムの実行は、外Kinect20.VisualGestureBuilder.dllを読むことができる場合は、フォルダ内にも「vgbtechs」このフォルダを持っている必要があります。そこでここでは、実行可能ファイルが置かれているにコピーされ、このフォルダにこのDLLファイルだけでなく、「vgbtechs」をお勧めしてください。

要するに、最初のいくつかはそうVGBは~~それの世話をするためにこのシステムを使用する方法を考えます

おすすめ

転載: blog.csdn.net/ZDT_zdh/article/details/90474238
おすすめ