diff --git a/samples/android/face-detection/jni/DetectionBaseTracker.cpp b/samples/android/face-detection/jni/DetectionBaseTracker.cpp index b58d832d6f..527d180d3d 100644 --- a/samples/android/face-detection/jni/DetectionBaseTracker.cpp +++ b/samples/android/face-detection/jni/DetectionBaseTracker.cpp @@ -5,6 +5,11 @@ #include #include +#include + +#define LOG_TAG "FaceDetection/DetectionBasedTracker" +#define LOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)) + using namespace std; using namespace cv; @@ -18,36 +23,122 @@ inline void vector_Rect_to_Mat(vector& v_rect, Mat& mat) JNIEXPORT jlong JNICALL Java_org_opencv_samples_fd_DetectionBaseTracker_nativeCreateObject (JNIEnv * jenv, jclass jobj, jstring jFileName, jint faceSize) { - const char* jnamestr = jenv->GetStringUTFChars(jFileName, NULL); + const char* jnamestr = jenv->GetStringUTFChars(jFileName, NULL); string stdFileName(jnamestr); - DetectionBasedTracker::Parameters DetectorParams; - if (faceSize > 0) - DetectorParams.minObjectSize = faceSize; - return (jlong)new DetectionBasedTracker(stdFileName, DetectorParams); + jlong result = 0; + + try + { + DetectionBasedTracker::Parameters DetectorParams; + if (faceSize > 0) + DetectorParams.minObjectSize = faceSize; + result = (jlong)new DetectionBasedTracker(stdFileName, DetectorParams); + } + catch(cv::Exception e) + { + LOGD("nativeCreateObject catched cv::Exception: %s", e.what()); + jclass je = jenv->FindClass("org/opencv/core/CvException"); + if(!je) + je = jenv->FindClass("java/lang/Exception"); + jenv->ThrowNew(je, e.what()); + } + + return result; } JNIEXPORT void JNICALL Java_org_opencv_samples_fd_DetectionBaseTracker_nativeDestroyObject (JNIEnv * jenv, jclass jobj, jlong thiz) { - delete (DetectionBasedTracker*)thiz; + try + { + ((DetectionBasedTracker*)thiz)->stop(); + delete (DetectionBasedTracker*)thiz; + } + catch(cv::Exception e) + { + LOGD("nativeestroyObject catched cv::Exception: %s", e.what()); + jclass je = jenv->FindClass("org/opencv/core/CvException"); + if(!je) + je = jenv->FindClass("java/lang/Exception"); + jenv->ThrowNew(je, e.what()); + } } JNIEXPORT void JNICALL Java_org_opencv_samples_fd_DetectionBaseTracker_nativeStart (JNIEnv * jenv, jclass jobj, jlong thiz) { - ((DetectionBasedTracker*)thiz)->run(); + try + { + ((DetectionBasedTracker*)thiz)->run(); + } + catch(cv::Exception e) + { + LOGD("nativeStart catched cv::Exception: %s", e.what()); + jclass je = jenv->FindClass("org/opencv/core/CvException"); + if(!je) + je = jenv->FindClass("java/lang/Exception"); + jenv->ThrowNew(je, e.what()); + } + } JNIEXPORT void JNICALL Java_org_opencv_samples_fd_DetectionBaseTracker_nativeStop (JNIEnv * jenv, jclass jobj, jlong thiz) { - ((DetectionBasedTracker*)thiz)->stop(); + try + { + ((DetectionBasedTracker*)thiz)->stop(); + } + catch(cv::Exception e) + { + LOGD("nativeStop catched cv::Exception: %s", e.what()); + jclass je = jenv->FindClass("org/opencv/core/CvException"); + if(!je) + je = jenv->FindClass("java/lang/Exception"); + jenv->ThrowNew(je, e.what()); + } } +JNIEXPORT void JNICALL Java_org_opencv_samples_fd_DetectionBaseTracker_nativeSetFaceSize +(JNIEnv * jenv, jclass jobj, jlong thiz, jint faceSize) +{ + try + { + if (faceSize > 0) + { + DetectionBasedTracker::Parameters DetectorParams = \ + ((DetectionBasedTracker*)thiz)->getParameters(); + DetectorParams.minObjectSize = faceSize; + ((DetectionBasedTracker*)thiz)->setParameters(DetectorParams); + } + + } + catch(cv::Exception e) + { + LOGD("nativeStop catched cv::Exception: %s", e.what()); + jclass je = jenv->FindClass("org/opencv/core/CvException"); + if(!je) + je = jenv->FindClass("java/lang/Exception"); + jenv->ThrowNew(je, e.what()); + } +} + + JNIEXPORT void JNICALL Java_org_opencv_samples_fd_DetectionBaseTracker_nativeDetect (JNIEnv * jenv, jclass jobj, jlong thiz, jlong imageGray, jlong faces) { - ((DetectionBasedTracker*)thiz)->process(*((Mat*)imageGray)); - ((DetectionBasedTracker*)thiz)->getObjects(RectFaces); - vector_Rect_to_Mat(RectFaces, *((Mat*)faces)); + try + { + ((DetectionBasedTracker*)thiz)->process(*((Mat*)imageGray)); + ((DetectionBasedTracker*)thiz)->getObjects(RectFaces); + vector_Rect_to_Mat(RectFaces, *((Mat*)faces)); + } + catch(cv::Exception e) + { + LOGD("nativeCreateObject catched cv::Exception: %s", e.what()); + jclass je = jenv->FindClass("org/opencv/core/CvException"); + if(!je) + je = jenv->FindClass("java/lang/Exception"); + jenv->ThrowNew(je, e.what()); + } } \ No newline at end of file diff --git a/samples/android/face-detection/jni/DetectionBaseTracker.h b/samples/android/face-detection/jni/DetectionBaseTracker.h index aaceef9868..d6015f93f4 100644 --- a/samples/android/face-detection/jni/DetectionBaseTracker.h +++ b/samples/android/face-detection/jni/DetectionBaseTracker.h @@ -39,6 +39,14 @@ JNIEXPORT void JNICALL Java_org_opencv_samples_fd_DetectionBaseTracker_nativeSta JNIEXPORT void JNICALL Java_org_opencv_samples_fd_DetectionBaseTracker_nativeStop (JNIEnv *, jclass, jlong); + /* + * Class: org_opencv_samples_fd_DetectionBaseTracker + * Method: nativeSetFaceSize + * Signature: (JI)V + */ + JNIEXPORT void JNICALL Java_org_opencv_samples_fd_DetectionBaseTracker_nativeSetFaceSize + (JNIEnv *, jclass, jlong, jint); + /* * Class: org_opencv_samples_fd_DetectionBaseTracker * Method: nativeDetect diff --git a/samples/android/face-detection/src/org/opencv/samples/fd/DetectionBaseTracker.java b/samples/android/face-detection/src/org/opencv/samples/fd/DetectionBaseTracker.java index 265bb88a47..7f776f6d40 100644 --- a/samples/android/face-detection/src/org/opencv/samples/fd/DetectionBaseTracker.java +++ b/samples/android/face-detection/src/org/opencv/samples/fd/DetectionBaseTracker.java @@ -20,6 +20,11 @@ public class DetectionBaseTracker nativeStop(mNativeObj); } + public void setMinFaceSize(int faceSize) + { + nativeSetFaceSize(mNativeObj, faceSize); + } + public void detect(Mat imageGray, MatOfRect faces) { nativeDetect(mNativeObj, imageGray.getNativeObjAddr(), faces.getNativeObjAddr()); @@ -27,17 +32,17 @@ public class DetectionBaseTracker public void release() { - nativeStop(mNativeObj); nativeDestroyObject(mNativeObj); mNativeObj = 0; } - protected long mNativeObj; + protected long mNativeObj = 0; protected static native long nativeCreateObject(String filename, int faceSize); protected static native void nativeDestroyObject(long thiz); protected static native void nativeStart(long thiz); protected static native void nativeStop(long thiz); + protected static native void nativeSetFaceSize(long thiz, int faceSize); protected static native void nativeDetect(long thiz, long inputImage, long resultMat); static diff --git a/samples/android/face-detection/src/org/opencv/samples/fd/FdView.java b/samples/android/face-detection/src/org/opencv/samples/fd/FdView.java index 3127a5a023..e424a99c66 100644 --- a/samples/android/face-detection/src/org/opencv/samples/fd/FdView.java +++ b/samples/android/face-detection/src/org/opencv/samples/fd/FdView.java @@ -43,8 +43,7 @@ class FdView extends SampleCvViewBase { { mFaceSize = Math.round(height * faceSize); } - mTracker.release(); - mTracker = new DetectionBaseTracker(mCascadeFile.getAbsolutePath(), mFaceSize); + mTracker.setMinFaceSize(mFaceSize); } public void setDtetectorType(int type) @@ -120,17 +119,14 @@ class FdView extends SampleCvViewBase { if (mDetectorType == CASCADE_DETECTOR) { - if (mCascade != null) { + if (mCascade != null) mCascade.detectMultiScale(mGray, faces, 1.1, 2, 2 // TODO: objdetect.CV_HAAR_SCALE_IMAGE , new Size(mFaceSize, mFaceSize), new Size()); - } } else if (mDetectorType == DBT_DETECTOR) { if (mTracker != null) - { mTracker.detect(mGray, faces); - } } else {