OpenNI context初始化

Context對象初始化方式

 

Context::Init

封裝了xnInit,裏面進行這幾個操作

 

<1>XnOSInit():

xnOSStartHighResTimer(&g_xnOSHighResGlobalTimer);

 

typedef struct XnOSTimer

{

  XnDouble dTicksPerTimeUnit;

  LARGE_INTEGER nStartTick;

} XnOSTimer;

XnOSTimer g_xnOSHighResGlobalTimer;

 

xnOSStartHighResTimer裏的主要內容:

bRetVal = QueryPerformanceFrequency(&nTicksPerSecond);

    pTimer->dTicksPerTimeUnit = (XnDouble)nTicksPerSecond.QuadPart / 1000.0;

bRetVal = QueryPerformanceCounter(&pTimer->nStartTick);

從這裏可以看到,這個函數主要是獲得系統CPU運行每幀所需的時間以及系統的高分辨率性能計數器的當前值,也就是CPU已經運行的次數,將它們存放到全局變量g_xnOSHighResGlobalTimer中

 

<2> xnLogInitSystem()

在這裏面主要是獲得當前執行文件所在的目錄以及當前的時間,將這些信息存放到全局變量static XnLoggerData g_xnLoggerData;中

 

<3>給成員分配內存空間

pContext->pLicenses = XN_NEW(XnLicenseList);

pContext->pModuleLoader = XN_NEW(XnModuleLoader, pContext);

pContext->pNodesMap = XN_NEW(XnNodesMap);

pContext->pGlobalErrorChangeEvent= XN_NEW(XnErrorStateChangedEvent);

 

這裏面進行的只是分配內存空間,構造函數裏面沒有進行什麼操作

 

<4>xnFPSInit(&pContext->readFPS, XN_NODE_FPS_CALC_SAMPLES)

XnFPSData readFPS;

typedef struct XnFPSDataImpl* XnFPSData;

struct XnFPSDataImpl

{

   /** An array of the time of each frame. */

   XnUInt64* anTimes;

   /** The size of the array. */

   XnUInt32 nArraySize;

   /** Index of the next place to write to. */

   XnUInt32 nCurrIndex;

};

 

XnStatus xnFPSInit(XnFPSData* pFPS, XnUInt32 nSamplesCount)

{

    ……………..

    XnFPSDataImpl* pData = *pFPS;

 

    // Allocate array

    XN_VALIDATE_ALIGNED_CALLOC(pData->anTimes, XnUInt64, nSamplesCount, XN_DEFAULT_MEM_ALIGN);

    pData->nArraySize = nSamplesCount;

    return XN_STATUS_OK;

}
  


  


XN_C_API XnStatus xnOSCreateEvent(XN_EVENT_HANDLE* pEventHandle, XnBool bManualReset)

{

    return (xnOSCreateNamedEvent(pEventHandle, NULL, bManualReset));

}

XN_C_API XnStatus xnOSCreateNamedEvent(XN_EVENT_HANDLE* pEventHandle, const XnChar* cpEventName, XnBool bManualReset)

{  

    ……….

    // Create a named event via the OS

    *pEventHandle = CreateEvent(NULL, bManualReset, FALSE, cpEventName); 

……………..   

    return (XN_STATUS_OK);
}



5>在這個函數裏,調用系統函數來創建一個命名的事件對象

 

HANDLE WINAPI CreateEvent(

  __in_opt  LPSECURITY_ATTRIBUTES lpEventAttributes,

  __in      BOOL bManualReset,

  __in      BOOL bInitialState,

  __in_opt  LPCTSTR lpName

);

lpEventAttributes:安全屬性對象,默認爲NULL,這樣子線程不可以繼承

bManualReset:是否自動重置,如果是,則需要手動調用ResetEvent來將事件對象重置成無信號狀態,否則在等待這個事件的線程退出後會自動將其狀態設成無信號的

bInitialState:初始狀態,爲真則爲有信號

lpName:名稱,大小寫敏感

 

<6>裝載模塊

pContext->pModuleLoader->Init();

 

XnStatus XnModuleLoader::Init()

{

………..

nRetVal = LoadAllModules();

…………

}

XnStatus XnModuleLoader::LoadAllModules()

{

         TiXmlDocument doc;

nRetVal = loadModulesFile(doc);//這裏加載modules.xml,使用系統的環境變量//OPEN_NI_INSTALL_PATH來獲得modules.xml的路徑

         TiXmlElement* pModule = doc.RootElement()->FirstChildElement(XN_MODULE_ELEMENT_NAME);

         while (pModule != NULL)

         {

                   const XnChar* strModulePath = NULL;

                   nRetVal = xnXmlReadStringAttribute(pModule, "path", &strModulePath);

                   XN_IS_STATUS_OK(nRetVal);

 

                   const XnChar* strConfigDir = pModule->Attribute("configDir");

 

                   nRetVal = LoadModule(strModulePath, strConfigDir);

                   XN_IS_STATUS_OK(nRetVal);

 

                   pModule = pModule->NextSiblingElement(XN_MODULE_ELEMENT_NAME);

         }

         ………

         return (XN_STATUS_OK);

}


這裏面只加載了Recorder,Mock Node 和Codec和XnDeviceSensorV2等多個模塊

Recorder這個模塊裏面的節點類型有:XN_NODE_TYPE_RECORDER,XN_NODE_TYPE_PLAYER

Mock Nodes裏面有:XN_NODE_TYPE_DEVICE,XN_NODE_TYPE_DEPTH,XN_NODE_TYPE_IMAGE,XN_NODE_TYPE_IR,XN_NODE_TYPE_AUDIO

Codec裏面有:XN_NODE_TYPE_CODEC,對應的strName分別有16zP,16Zt,Im8z,NONE,JPEG

XnDeviceSensorV2裏面有各種產品節點的類型

XnVFeatures提供了場景分析和骨骼提取的功能

XnVHandGenerator提供了手勢識別的功能

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章