// デプスのヒストグラムを作成 depth_hist getDepthHistgram(const xn::DepthGenerator& depth, const xn::DepthMetaData& depthMD) { // デプスの傾向を計算する(アルゴリズムはNiSimpleViewer.cppを利用) const int MAX_DEPTH = depth.GetDeviceMaxDepth(); depth_hist depthHist(MAX_DEPTH); unsigned int points = 0; const XnDepthPixel* pDepth = depthMD.Data(); for (XnUInt y = 0; y < depthMD.YRes(); ++y) { for (XnUInt x = 0; x < depthMD.XRes(); ++x, ++pDepth) { if (*pDepth != 0) { depthHist[*pDepth]++; points++; } } } for (int i = 1; i < MAX_DEPTH; ++i) { depthHist[i] += depthHist[i-1]; } if ( points != 0) { for (int i = 1; i < MAX_DEPTH; ++i) { depthHist[i] = (unsigned int)(256 * (1.0f - (depthHist[i] / points))); } } return depthHist; }
double CvCapture_OpenNI::getDepthGeneratorProperty( int propIdx ) { double propValue = 0; if( !depthGenerator.IsValid() ) return propValue; XnMapOutputMode mode; switch( propIdx ) { case CV_CAP_PROP_OPENNI_GENERATOR_PRESENT : CV_DbgAssert( depthGenerator.IsValid() ); propValue = 1.; break; case CV_CAP_PROP_FRAME_WIDTH : if( depthGenerator.GetMapOutputMode(mode) == XN_STATUS_OK ) propValue = mode.nXRes; break; case CV_CAP_PROP_FRAME_HEIGHT : if( depthGenerator.GetMapOutputMode(mode) == XN_STATUS_OK ) propValue = mode.nYRes; break; case CV_CAP_PROP_FPS : if( depthGenerator.GetMapOutputMode(mode) == XN_STATUS_OK ) propValue = mode.nFPS; break; case CV_CAP_PROP_OPENNI_FRAME_MAX_DEPTH : propValue = depthGenerator.GetDeviceMaxDepth(); break; case CV_CAP_PROP_OPENNI_BASELINE : propValue = baseline; break; case CV_CAP_PROP_OPENNI_FOCAL_LENGTH : propValue = (double)depthFocalLength_VGA; break; case CV_CAP_PROP_OPENNI_REGISTRATION : propValue = depthGenerator.GetAlternativeViewPointCap().IsViewPointAs(imageGenerator) ? 1.0 : 0.0; break; case CV_CAP_PROP_POS_MSEC : propValue = depthGenerator.GetTimestamp(); break; case CV_CAP_PROP_POS_FRAMES : propValue = depthGenerator.GetFrameID(); break; default : { std::stringstream ss; ss << "Depth generator does not support such parameter (propIdx=" << propIdx << ") for getting.\n"; CV_Error( CV_StsBadArg, ss.str().c_str() ); } } return propValue; }
XnStatus XnFileDevice::UpdateS2DTables(const xn::DepthGenerator& depth) { XnStatus nRetVal = XN_STATUS_OK; XnUInt64 nTemp; XnDouble dTemp; // get config XnShiftToDepthConfig config; nRetVal = depth.GetIntProperty(XN_STREAM_PROPERTY_ZERO_PLANE_DISTANCE, nTemp); XN_IS_STATUS_OK(nRetVal); config.nZeroPlaneDistance = (XnDepthPixel)nTemp; nRetVal = depth.GetRealProperty(XN_STREAM_PROPERTY_ZERO_PLANE_PIXEL_SIZE, dTemp); XN_IS_STATUS_OK(nRetVal); config.fZeroPlanePixelSize = (XnFloat)dTemp; nRetVal = depth.GetRealProperty(XN_STREAM_PROPERTY_EMITTER_DCMOS_DISTANCE, dTemp); XN_IS_STATUS_OK(nRetVal); config.fEmitterDCmosDistance = (XnFloat)dTemp; nRetVal = depth.GetIntProperty(XN_STREAM_PROPERTY_MAX_SHIFT, nTemp); XN_IS_STATUS_OK(nRetVal); config.nDeviceMaxShiftValue = (XnUInt32)nTemp; config.nDeviceMaxDepthValue = depth.GetDeviceMaxDepth(); nRetVal = depth.GetIntProperty(XN_STREAM_PROPERTY_CONST_SHIFT, nTemp); XN_IS_STATUS_OK(nRetVal); config.nConstShift = (XnUInt32)nTemp; nRetVal = depth.GetIntProperty(XN_STREAM_PROPERTY_PIXEL_SIZE_FACTOR, nTemp); XN_IS_STATUS_OK(nRetVal); config.nPixelSizeFactor = (XnUInt32)nTemp; nRetVal = depth.GetIntProperty(XN_STREAM_PROPERTY_PARAM_COEFF, nTemp); XN_IS_STATUS_OK(nRetVal); config.nParamCoeff = (XnUInt32)nTemp; nRetVal = depth.GetIntProperty(XN_STREAM_PROPERTY_SHIFT_SCALE, nTemp); XN_IS_STATUS_OK(nRetVal); config.nShiftScale = (XnUInt32)nTemp; config.nDepthMinCutOff = 0; config.nDepthMaxCutOff = (XnDepthPixel)config.nDeviceMaxDepthValue; if (!m_ShiftToDepth.bIsInitialized) { nRetVal = XnShiftToDepthInit(&m_ShiftToDepth, &config); XN_IS_STATUS_OK(nRetVal); } else { nRetVal = XnShiftToDepthUpdate(&m_ShiftToDepth, &config); XN_IS_STATUS_OK(nRetVal); } // notify nRetVal = m_pNotifications->OnNodeGeneralPropChanged(m_pNotificationsCookie, depth.GetName(), XN_STREAM_PROPERTY_S2D_TABLE, m_ShiftToDepth.nShiftsCount * sizeof(XnDepthPixel), m_ShiftToDepth.pShiftToDepthTable); XN_IS_STATUS_OK(nRetVal); nRetVal = m_pNotifications->OnNodeGeneralPropChanged(m_pNotificationsCookie, depth.GetName(), XN_STREAM_PROPERTY_D2S_TABLE, m_ShiftToDepth.nDepthsCount * sizeof(XnUInt16), m_ShiftToDepth.pDepthToShiftTable); XN_IS_STATUS_OK(nRetVal); return (XN_STATUS_OK); }