IplImage* CvCapture_Android::retrieveFrame( int outputType ) { IplImage* image = NULL; cv::Mat m_frameYUV420_ref = m_frameYUV420; unsigned char *current_frameYUV420=m_frameYUV420_ref.ptr(); //Attention! all the operations in this function below should occupy less time than the period between two frames from camera if (NULL != current_frameYUV420) { if (m_frameFormat == noformat) { union {double prop; const char* name;} u; u.prop = getProperty(CV_CAP_PROP_PREVIEW_FORMAT); if (0 == strcmp(u.name, "yuv420sp")) m_frameFormat = yuv420sp; else if (0 == strcmp(u.name, "yvu420sp")) m_frameFormat = yvu420sp; else m_frameFormat = yuvUnknown; } switch(outputType) { case CV_CAP_ANDROID_GREY_FRAME: if (!m_hasGray) if (!(m_hasGray = convertYUV2Grey(m_width, m_height, current_frameYUV420, m_frameGray.mat))) return NULL; image = m_frameGray.getIplImagePtr(); break; case CV_CAP_ANDROID_COLOR_FRAME_BGR: case CV_CAP_ANDROID_COLOR_FRAME_RGB: if (!m_hasColor) if (!(m_hasColor = convertYUV2BGR(m_width, m_height, current_frameYUV420, m_frameColor.mat, outputType == CV_CAP_ANDROID_COLOR_FRAME_RGB, false))) return NULL; image = m_frameColor.getIplImagePtr(); break; case CV_CAP_ANDROID_COLOR_FRAME_BGRA: case CV_CAP_ANDROID_COLOR_FRAME_RGBA: if (!m_hasColor) if (!(m_hasColor = convertYUV2BGR(m_width, m_height, current_frameYUV420, m_frameColor.mat, outputType == CV_CAP_ANDROID_COLOR_FRAME_RGBA, true))) return NULL; image = m_frameColor.getIplImagePtr(); break; default: LOGE("Unsupported frame output format: %d", outputType); CV_Error( CV_StsOutOfRange, "Output frame format is not supported." ); image = NULL; break; } } return image; }
IplImage* CvCapture_Android::retrieveFrame( int outputType ) { IplImage* image = NULL; unsigned char *current_frameYUV420i=m_frameYUV420i; //Attention! all the operations in this function below should occupy less time than the period between two frames from camera if (NULL != current_frameYUV420i) { switch(outputType) { case CV_CAP_ANDROID_GREY_FRAME: if (!m_hasGray) if (!(m_hasGray = convertYUV420i2Grey(m_width, m_height, current_frameYUV420i, m_frameGray.mat))) return NULL; image = m_frameGray.getIplImagePtr(); break; case CV_CAP_ANDROID_COLOR_FRAME_BGR: case CV_CAP_ANDROID_COLOR_FRAME_RGB: if (!m_hasColor) if (!(m_hasColor = convertYUV420i2BGR(m_width, m_height, current_frameYUV420i, m_frameColor.mat, outputType == CV_CAP_ANDROID_COLOR_FRAME_RGB, false))) return NULL; image = m_frameColor.getIplImagePtr(); break; case CV_CAP_ANDROID_COLOR_FRAME_BGRA: case CV_CAP_ANDROID_COLOR_FRAME_RGBA: if (!m_hasColor) if (!(m_hasColor = convertYUV420i2BGR(m_width, m_height, current_frameYUV420i, m_frameColor.mat, outputType == CV_CAP_ANDROID_COLOR_FRAME_RGBA, true))) return NULL; image = m_frameColor.getIplImagePtr(); break; default: LOGE("Unsupported frame output format: %d", outputType); CV_Error( CV_StsOutOfRange, "Output frame format is not supported." ); image = NULL; break; } } return image; }