void initializeFace(){ // 顔検出を有効にする auto sts = senseManager->EnableFace(); if (sts<PXC_STATUS_NO_ERROR) { throw std::runtime_error("顔検出の有効化に失敗しました"); } //顔検出器を生成する PXCFaceModule* faceModule = senseManager->QueryFace(); if (faceModule == 0) { throw std::runtime_error("顔検出器の作成に失敗しました"); } //顔検出のプロパティを取得 PXCFaceConfiguration* config = faceModule->CreateActiveConfiguration(); if (config == 0) { throw std::runtime_error("顔検出のプロパティ取得に失敗しました"); } config->SetTrackingMode(PXCFaceConfiguration::TrackingModeType::FACE_MODE_COLOR_PLUS_DEPTH); config->ApplyChanges(); // パイプラインを初期化する sts = senseManager->Init(); if (sts<PXC_STATUS_NO_ERROR) { throw std::runtime_error("パイプラインの初期化に失敗しました"); } // デバイス情報の取得 auto device = senseManager->QueryCaptureManager()->QueryDevice(); if (device == 0) { throw std::runtime_error("デバイスの取得に失敗しました"); } // ミラー表示にする device->SetMirrorMode(PXCCapture::Device::MirrorMode::MIRROR_MODE_HORIZONTAL); PXCCapture::DeviceInfo deviceInfo; device->QueryDeviceInfo(&deviceInfo); if (deviceInfo.model == PXCCapture::DEVICE_MODEL_IVCAM) { device->SetDepthConfidenceThreshold(1); device->SetIVCAMFilterOption(6); device->SetIVCAMMotionRangeTradeOff(21); } config->detection.isEnabled = true; config->landmarks.isEnabled = true; //追加:ランドマーク取得を可能にする config->landmarks.maxTrackedFaces = LANDMARK_MAXFACES; //追加:複数人数に対応させる config->ApplyChanges(); faceData = faceModule->CreateOutput(); }
void initilize() { // SenseManagerを生成する senseManager = PXCSenseManager::CreateInstance(); if ( senseManager == 0 ) { throw std::runtime_error( "SenseManagerの生成に失敗しました" ); } // カラーストリームを有効にする auto sts = senseManager->EnableStream( PXCCapture::StreamType::STREAM_TYPE_COLOR, COLOR_WIDTH, COLOR_HEIGHT, COLOR_FPS ); if ( sts<PXC_STATUS_NO_ERROR ) { throw std::runtime_error( "カラーストリームの有効化に失敗しました" ); } // Depthストリームを有効にする sts = senseManager->EnableStream( PXCCapture::StreamType::STREAM_TYPE_DEPTH, DEPTH_WIDTH, DEPTH_HEIGHT, DEPTH_FPS ); if ( sts<PXC_STATUS_NO_ERROR ) { throw std::runtime_error( "Depthストリームの有効化に失敗しました" ); } // 手の検出を有効にする sts = senseManager->EnableHand(); if ( sts < PXC_STATUS_NO_ERROR ) { throw std::runtime_error( "手の検出の有効化に失敗しました" ); } // パイプラインを初期化する sts = senseManager->Init(); if ( sts<PXC_STATUS_NO_ERROR ) { throw std::runtime_error( "パイプラインの初期化に失敗しました" ); } // デバイスを取得する auto device = senseManager->QueryCaptureManager()->QueryDevice(); // ミラー表示にする device->SetMirrorMode( PXCCapture::Device::MirrorMode::MIRROR_MODE_HORIZONTAL ); // 座標変換オブジェクトを作成 projection = device->CreateProjection(); // 手の検出の初期化 initializeHandTracking(); }
int Init() { XnStatus rc; //Make sure our image types are the same as the OpenNI image types. assert(sizeof(XnRGB24Pixel) == sizeof(ColorPixel)); assert(sizeof(XnDepthPixel) == sizeof(DepthPixel)); assert(sizeof(XnStatus) == sizeof(int)); // Load OpenNI xml settings char filePath[255]; int length = Util::Helpers::GetExeDirectory(filePath, sizeof(filePath)); filePath[length] = '\\'; strcpy(&filePath[length+1], SAMPLE_XML_PATH); EnumerationErrors errors; rc = deviceContext.InitFromXmlFile(filePath, &errors); if (rc == XN_STATUS_NO_NODE_PRESENT) { //One reason would be if Microsoft SDK is installed beside PrimeSense. Device manager should say PrimeSense instead of Microsoft Kinect. //XnChar strError[1024]; //errors.ToString(strError, 1024); //LOGE("%s\n", strError); return -1; } else if (rc != XN_STATUS_OK) { fprintf(stderr, "%s\n", xnGetStatusString(rc)); /*LOGE("Open failed: %s\n", xnGetStatusString(rc));*/ return (rc); } // Retrieve colour and depth nodes rc = deviceContext.FindExistingNode(XN_NODE_TYPE_IMAGE, colorImageGenerator); rc = deviceContext.FindExistingNode(XN_NODE_TYPE_DEPTH, depthImageGenerator); // Set mirror mode to off SetMirrorMode(false); // Get a frame to perform checks on it ImageMetaData colorImageMetaData; DepthMetaData depthImageMetaData; depthImageGenerator.GetMetaData(depthImageMetaData); colorImageGenerator.GetMetaData(colorImageMetaData); // Hybrid mode isn't supported in this sample if (colorImageMetaData.FullXRes() != depthImageMetaData.FullXRes() || colorImageMetaData.FullYRes() != depthImageMetaData.FullYRes()) { /*LOGE("The device depth and image resolution must be equal!\n");*/ return 1; } // RGB is the only image format supported. if (colorImageMetaData.PixelFormat() != XN_PIXEL_FORMAT_RGB24) { /*LOGE("The device image format must be RGB24\n");*/ return 1; } // Need to make sure the automatic alignment of colour and depth images is supported. XnBool isSupported = depthImageGenerator.IsCapabilitySupported("AlternativeViewPoint"); if(!isSupported) { /*LOGE("Cannot set AlternativeViewPoint!\n");*/ return 1; } // Set it to VGA maps at 30 FPS /*XnMapOutputMode mapMode; mapMode.nXRes = XN_VGA_X_RES; mapMode.nYRes = XN_VGA_Y_RES; mapMode.nFPS = 60; rc = g_depth.SetMapOutputMode(mapMode); if(rc) { LOGE("Failed to set depth map mode: %s\n", xnGetStatusString(rc)); return 1; } mapMode.nFPS = 30; rc = g_image.SetMapOutputMode(mapMode); if(rc) { LOGE("Failed to set image map mode: %s\n", xnGetStatusString(rc)); return 1; }*/ // Set automatic alignment of the colour and depth images. rc = depthImageGenerator.GetAlternativeViewPointCap().SetViewPoint(colorImageGenerator); if(rc) { /*LOGE("Failed to set depth map mode: %s\n", xnGetStatusString(rc));*/ return 1; } return XN_STATUS_OK; }