#include #include #include #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; inline void vector_Rect_to_Mat(vector& v_rect, Mat& mat) { mat = Mat(v_rect, true); } class CascadeDetectorAdapter: public DetectionBasedTracker::IDetector { public: CascadeDetectorAdapter(cv::Ptr detector): IDetector(), Detector(detector) { LOGD("CascadeDetectorAdapter::Detect::Detect"); CV_Assert(detector); } void detect(const cv::Mat &Image, std::vector &objects) { LOGD("CascadeDetectorAdapter::Detect: begin"); LOGD("CascadeDetectorAdapter::Detect: scaleFactor=%.2f, minNeighbours=%d, minObjSize=(%dx%d), maxObjSize=(%dx%d)", scaleFactor, minNeighbours, minObjSize.width, minObjSize.height, maxObjSize.width, maxObjSize.height); Detector->detectMultiScale(Image, objects, scaleFactor, minNeighbours, 0, minObjSize, maxObjSize); LOGD("CascadeDetectorAdapter::Detect: end"); } virtual ~CascadeDetectorAdapter() { LOGD("CascadeDetectorAdapter::Detect::~Detect"); } private: CascadeDetectorAdapter(); cv::Ptr Detector; }; struct DetectorAgregator { cv::Ptr mainDetector; cv::Ptr trackingDetector; cv::Ptr tracker; DetectorAgregator(cv::Ptr& _mainDetector, cv::Ptr& _trackingDetector): mainDetector(_mainDetector), trackingDetector(_trackingDetector) { CV_Assert(_mainDetector); CV_Assert(_trackingDetector); DetectionBasedTracker::Parameters DetectorParams; tracker = makePtr(mainDetector, trackingDetector, DetectorParams); } }; JNIEXPORT jlong JNICALL Java_org_opencv_samples_facedetect_DetectionBasedTracker_nativeCreateObject (JNIEnv * jenv, jclass, jstring jFileName, jint faceSize) { LOGD("Java_org_opencv_samples_facedetect_DetectionBasedTracker_nativeCreateObject enter"); const char* jnamestr = jenv->GetStringUTFChars(jFileName, NULL); string stdFileName(jnamestr); jlong result = 0; LOGD("Java_org_opencv_samples_facedetect_DetectionBasedTracker_nativeCreateObject"); try { cv::Ptr mainDetector = makePtr( makePtr(stdFileName)); cv::Ptr trackingDetector = makePtr( makePtr(stdFileName)); result = (jlong)new DetectorAgregator(mainDetector, trackingDetector); if (faceSize > 0) { mainDetector->setMinObjectSize(Size(faceSize, faceSize)); //trackingDetector->setMinObjectSize(Size(faceSize, faceSize)); } } catch(const cv::Exception& e) { LOGD("nativeCreateObject caught 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()); } catch (...) { LOGD("nativeCreateObject caught unknown exception"); jclass je = jenv->FindClass("java/lang/Exception"); jenv->ThrowNew(je, "Unknown exception in JNI code of DetectionBasedTracker.nativeCreateObject()"); return 0; } LOGD("Java_org_opencv_samples_facedetect_DetectionBasedTracker_nativeCreateObject exit"); return result; } JNIEXPORT void JNICALL Java_org_opencv_samples_facedetect_DetectionBasedTracker_nativeDestroyObject (JNIEnv * jenv, jclass, jlong thiz) { LOGD("Java_org_opencv_samples_facedetect_DetectionBasedTracker_nativeDestroyObject"); try { if(thiz != 0) { ((DetectorAgregator*)thiz)->tracker->stop(); delete (DetectorAgregator*)thiz; } } catch(const cv::Exception& e) { LOGD("nativeestroyObject caught 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()); } catch (...) { LOGD("nativeDestroyObject caught unknown exception"); jclass je = jenv->FindClass("java/lang/Exception"); jenv->ThrowNew(je, "Unknown exception in JNI code of DetectionBasedTracker.nativeDestroyObject()"); } LOGD("Java_org_opencv_samples_facedetect_DetectionBasedTracker_nativeDestroyObject exit"); } JNIEXPORT void JNICALL Java_org_opencv_samples_facedetect_DetectionBasedTracker_nativeStart (JNIEnv * jenv, jclass, jlong thiz) { LOGD("Java_org_opencv_samples_facedetect_DetectionBasedTracker_nativeStart"); try { ((DetectorAgregator*)thiz)->tracker->run(); } catch(const cv::Exception& e) { LOGD("nativeStart caught 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()); } catch (...) { LOGD("nativeStart caught unknown exception"); jclass je = jenv->FindClass("java/lang/Exception"); jenv->ThrowNew(je, "Unknown exception in JNI code of DetectionBasedTracker.nativeStart()"); } LOGD("Java_org_opencv_samples_facedetect_DetectionBasedTracker_nativeStart exit"); } JNIEXPORT void JNICALL Java_org_opencv_samples_facedetect_DetectionBasedTracker_nativeStop (JNIEnv * jenv, jclass, jlong thiz) { LOGD("Java_org_opencv_samples_facedetect_DetectionBasedTracker_nativeStop"); try { ((DetectorAgregator*)thiz)->tracker->stop(); } catch(const cv::Exception& e) { LOGD("nativeStop caught 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()); } catch (...) { LOGD("nativeStop caught unknown exception"); jclass je = jenv->FindClass("java/lang/Exception"); jenv->ThrowNew(je, "Unknown exception in JNI code of DetectionBasedTracker.nativeStop()"); } LOGD("Java_org_opencv_samples_facedetect_DetectionBasedTracker_nativeStop exit"); } JNIEXPORT void JNICALL Java_org_opencv_samples_facedetect_DetectionBasedTracker_nativeSetFaceSize (JNIEnv * jenv, jclass, jlong thiz, jint faceSize) { LOGD("Java_org_opencv_samples_facedetect_DetectionBasedTracker_nativeSetFaceSize -- BEGIN"); try { if (faceSize > 0) { ((DetectorAgregator*)thiz)->mainDetector->setMinObjectSize(Size(faceSize, faceSize)); //((DetectorAgregator*)thiz)->trackingDetector->setMinObjectSize(Size(faceSize, faceSize)); } } catch(const cv::Exception& e) { LOGD("nativeStop caught 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()); } catch (...) { LOGD("nativeSetFaceSize caught unknown exception"); jclass je = jenv->FindClass("java/lang/Exception"); jenv->ThrowNew(je, "Unknown exception in JNI code of DetectionBasedTracker.nativeSetFaceSize()"); } LOGD("Java_org_opencv_samples_facedetect_DetectionBasedTracker_nativeSetFaceSize -- END"); } JNIEXPORT void JNICALL Java_org_opencv_samples_facedetect_DetectionBasedTracker_nativeDetect (JNIEnv * jenv, jclass, jlong thiz, jlong imageGray, jlong faces) { LOGD("Java_org_opencv_samples_facedetect_DetectionBasedTracker_nativeDetect"); try { vector RectFaces; ((DetectorAgregator*)thiz)->tracker->process(*((Mat*)imageGray)); ((DetectorAgregator*)thiz)->tracker->getObjects(RectFaces); *((Mat*)faces) = Mat(RectFaces, true); } catch(const cv::Exception& e) { LOGD("nativeCreateObject caught 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()); } catch (...) { LOGD("nativeDetect caught unknown exception"); jclass je = jenv->FindClass("java/lang/Exception"); jenv->ThrowNew(je, "Unknown exception in JNI code DetectionBasedTracker.nativeDetect()"); } LOGD("Java_org_opencv_samples_facedetect_DetectionBasedTracker_nativeDetect END"); }