bool CvCapture_OpenNI::grabFrame() { if( !isOpened() ) return false; bool isGrabbed = false; if( !approxSyncGrabber.empty() && approxSyncGrabber->isRun() ) { isGrabbed = approxSyncGrabber->grab( depthMetaData, imageMetaData ); } else { XnStatus status = context.WaitAndUpdateAll(); if( status != XN_STATUS_OK ) return false; if( depthGenerator.IsValid() ) depthGenerator.GetMetaData( depthMetaData ); if( imageGenerator.IsValid() ) imageGenerator.GetMetaData( imageMetaData ); isGrabbed = true; } return isGrabbed; }
double CvCapture_OpenNI::getCommonProperty( int propIdx ) { double propValue = 0; switch( propIdx ) { // There is a set of properties that correspond to depth generator by default // (is they are pass without particular generator flag). Two reasons of this: // 1) We can assume that depth generator is the main one for depth sensor. // 2) In the initial vertions of OpenNI integration to OpenCV the value of // flag CV_CAP_OPENNI_DEPTH_GENERATOR was 0 (it isn't zero now). case CV_CAP_PROP_OPENNI_GENERATOR_PRESENT : case CV_CAP_PROP_FRAME_WIDTH : case CV_CAP_PROP_FRAME_HEIGHT : case CV_CAP_PROP_FPS : case CV_CAP_PROP_OPENNI_FRAME_MAX_DEPTH : case CV_CAP_PROP_OPENNI_BASELINE : case CV_CAP_PROP_OPENNI_FOCAL_LENGTH : case CV_CAP_PROP_OPENNI_REGISTRATION : propValue = getDepthGeneratorProperty( propIdx ); break; case CV_CAP_PROP_OPENNI_APPROX_FRAME_SYNC : propValue = !approxSyncGrabber.empty() && approxSyncGrabber->isRun() ? 1. : 0.; break; case CV_CAP_PROP_OPENNI_MAX_BUFFER_SIZE : propValue = maxBufferSize; break; case CV_CAP_PROP_OPENNI_CIRCLE_BUFFER : propValue = isCircleBuffer ? 1. : 0.; break; case CV_CAP_PROP_OPENNI_MAX_TIME_DURATION : propValue = maxTimeDuration; break; default : { std::stringstream ss; ss << "Such parameter (propIdx=" << propIdx << ") isn't supported for getting.\n"; CV_Error( CV_StsBadArg, ss.str().c_str() ); } } return propValue; }