123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251 |
- #include <DetectionBasedTracker_jni.h>
- #include <opencv2/core.hpp>
- #include <opencv2/objdetect.hpp>
- #include <string>
- #include <vector>
- #include <android/log.h>
- #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<Rect>& v_rect, Mat& mat)
- {
- mat = Mat(v_rect, true);
- }
- class CascadeDetectorAdapter: public DetectionBasedTracker::IDetector
- {
- public:
- CascadeDetectorAdapter(cv::Ptr<cv::CascadeClassifier> detector):
- IDetector(),
- Detector(detector)
- {
- LOGD("CascadeDetectorAdapter::Detect::Detect");
- CV_Assert(detector);
- }
- void detect(const cv::Mat &Image, std::vector<cv::Rect> &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<cv::CascadeClassifier> Detector;
- };
- struct DetectorAgregator
- {
- cv::Ptr<CascadeDetectorAdapter> mainDetector;
- cv::Ptr<CascadeDetectorAdapter> trackingDetector;
- cv::Ptr<DetectionBasedTracker> tracker;
- DetectorAgregator(cv::Ptr<CascadeDetectorAdapter>& _mainDetector, cv::Ptr<CascadeDetectorAdapter>& _trackingDetector):
- mainDetector(_mainDetector),
- trackingDetector(_trackingDetector)
- {
- CV_Assert(_mainDetector);
- CV_Assert(_trackingDetector);
- DetectionBasedTracker::Parameters DetectorParams;
- tracker = makePtr<DetectionBasedTracker>(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<CascadeDetectorAdapter> mainDetector = makePtr<CascadeDetectorAdapter>(
- makePtr<CascadeClassifier>(stdFileName));
- cv::Ptr<CascadeDetectorAdapter> trackingDetector = makePtr<CascadeDetectorAdapter>(
- makePtr<CascadeClassifier>(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<Rect> 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");
- }
|