openni context 초기화

9394 단어 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);
}

  
  
  
이 함수에서 시스템 함수를 호출하여 이름난 이벤트 대상을 만듭니다
 
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 모듈의 노드 유형은 다음과 같습니다. XNNODE_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는 제스처 인식 기능을 제공합니다.
.
.
.
.

좋은 웹페이지 즐겨찾기