JNIEXPORT void JNICALL Java_org_opencv_video_BackgroundSubtractor_apply_11 (JNIEnv* env, jclass , jlong self, jlong image_nativeObj, jlong fgmask_nativeObj) { try { LOGD("video::apply_11()"); BackgroundSubtractor* me = (BackgroundSubtractor*) self; //TODO: check for NULL Mat& image = *((Mat*)image_nativeObj); Mat& fgmask = *((Mat*)fgmask_nativeObj); me->operator ()( image, fgmask ); return; } catch(cv::Exception e) { LOGD("video::apply_11() catched cv::Exception: %s", e.what()); jclass je = env->FindClass("org/opencv/core/CvException"); if(!je) je = env->FindClass("java/lang/Exception"); env->ThrowNew(je, e.what()); return; } catch (...) { LOGD("video::apply_11() catched unknown exception (...)"); jclass je = env->FindClass("java/lang/Exception"); env->ThrowNew(je, "Unknown exception in JNI code {video::apply_11()}"); return; } }
bool Pipeline::apply_backgroundSubtractor(json_t *pStage, json_t *pStageModel, Model &model) { validateImage(model.image); int history = jo_int(pStage, "history", 0, model.argMap); float varThreshold = jo_float(pStage, "varThreshold", 16, model.argMap); bool bShadowDetection = jo_bool(pStage, "bShadowDetection", TRUE, model.argMap); string background = jo_string(pStage, "background", "", model.argMap); string method = jo_string(pStage, "method", "MOG2", model.argMap); string stageName = jo_string(pStage, "name", method.c_str(), model.argMap); int maxval = 255; double learningRate = jo_double(pStage, "learningRate", -1, model.argMap); const char *errMsg = NULL; StageDataPtr pStageData = model.stageDataMap[stageName]; BackgroundSubtractor *pSubtractor; bool is_absdiff = false; if (!errMsg) { if (method.compare("MOG2") == 0) { if (pStageData) { pSubtractor = ((SubtractorStageData *) pStageData)->pSubtractor; } else { pSubtractor = new BackgroundSubtractorMOG2(history, varThreshold, bShadowDetection); model.stageDataMap[stageName] = new SubtractorStageData(stageName, pSubtractor); } } else if (method.compare("absdiff") == 0) { is_absdiff = true; } else { errMsg = "Expected method: MOG2"; } } Mat bgImage; if (!background.empty()) { if (history != 0) { errMsg = "Expected history=0 if background image is specified"; } else { if (model.image.channels() == 1) { bgImage = imread(background.c_str(), CV_LOAD_IMAGE_GRAYSCALE); } else { bgImage = imread(background.c_str(), CV_LOAD_IMAGE_COLOR); } if (bgImage.data) { LOGTRACE2("apply_backgroundSubtractor(%s) %s", background.c_str(), matInfo(bgImage).c_str()); if (model.image.rows!=bgImage.rows || model.image.cols!=bgImage.cols) { errMsg = "Expected background image of same size as pipeline image"; } } else { errMsg = "Could not load background image"; } } } if (!errMsg) { if (history < 0) { errMsg = "Expected history >= 0"; } } if (!errMsg) { Mat fgMask; if (is_absdiff) { absdiff(model.image, bgImage, fgMask); if (fgMask.channels() > 1) { cvtColor(fgMask, fgMask, CV_BGR2GRAY); } threshold(fgMask, model.image, varThreshold, maxval, THRESH_BINARY); } else { if (bgImage.data) { pSubtractor->operator()(bgImage, fgMask, learningRate); } pSubtractor->operator()(model.image, fgMask, learningRate); model.image = fgMask; } } return stageOK("apply_backgroundSubtractor(%s) %s", errMsg, pStage, pStageModel); }