-
Notifications
You must be signed in to change notification settings - Fork 28
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
dragonstar
committed
Apr 7, 2022
1 parent
a6e11d3
commit d7de638
Showing
16 changed files
with
2,184 additions
and
20,824 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
251 changes: 251 additions & 0 deletions
251
finengine/src/main/cpp/facedetect/DetectionBasedTracker_jni.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,251 @@ | ||
#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_com_ifinver_finengine_DetectionBasedTracker_nativeCreateObject | ||
(JNIEnv * jenv, jclass, jstring jFileName, jint faceSize) | ||
{ | ||
LOGD("Java_com_ifinver_finengine_DetectionBasedTracker_nativeCreateObject enter"); | ||
const char* jnamestr = jenv->GetStringUTFChars(jFileName, NULL); | ||
string stdFileName(jnamestr); | ||
jlong result = 0; | ||
|
||
LOGD("Java_com_ifinver_finengine_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_com_ifinver_finengine_DetectionBasedTracker_nativeCreateObject exit"); | ||
return result; | ||
} | ||
|
||
JNIEXPORT void JNICALL Java_com_ifinver_finengine_DetectionBasedTracker_nativeDestroyObject | ||
(JNIEnv * jenv, jclass, jlong thiz) | ||
{ | ||
LOGD("Java_com_ifinver_finengine_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_com_ifinver_finengine_DetectionBasedTracker_nativeDestroyObject exit"); | ||
} | ||
|
||
JNIEXPORT void JNICALL Java_com_ifinver_finengine_DetectionBasedTracker_nativeStart | ||
(JNIEnv * jenv, jclass, jlong thiz) | ||
{ | ||
LOGD("Java_com_ifinver_finengine_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_com_ifinver_finengine_DetectionBasedTracker_nativeStart exit"); | ||
} | ||
|
||
JNIEXPORT void JNICALL Java_com_ifinver_finengine_DetectionBasedTracker_nativeStop | ||
(JNIEnv * jenv, jclass, jlong thiz) | ||
{ | ||
LOGD("Java_com_ifinver_finengine_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_com_ifinver_finengine_DetectionBasedTracker_nativeStop exit"); | ||
} | ||
|
||
JNIEXPORT void JNICALL Java_com_ifinver_finengine_DetectionBasedTracker_nativeSetFaceSize | ||
(JNIEnv * jenv, jclass, jlong thiz, jint faceSize) | ||
{ | ||
LOGD("Java_com_ifinver_finengine_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_com_ifinver_finengine_DetectionBasedTracker_nativeSetFaceSize -- END"); | ||
} | ||
|
||
|
||
JNIEXPORT void JNICALL Java_com_ifinver_finengine_DetectionBasedTracker_nativeDetect | ||
(JNIEnv * jenv, jclass, jlong thiz, jlong imageGray, jlong faces) | ||
{ | ||
LOGD("Java_com_ifinver_finengine_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_com_ifinver_finengine_DetectionBasedTracker_nativeDetect END"); | ||
} |
62 changes: 62 additions & 0 deletions
62
finengine/src/main/cpp/facedetect/DetectionBasedTracker_jni.h
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
41 changes: 41 additions & 0 deletions
41
finengine/src/main/java/com/ifinver/finengine/DetectionBasedTracker.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
package com.ifinver.finengine; | ||
|
||
import org.opencv.core.Mat; | ||
import org.opencv.core.MatOfRect; | ||
|
||
public class DetectionBasedTracker | ||
{ | ||
public DetectionBasedTracker(String cascadeName, int minFaceSize) { | ||
mNativeObj = nativeCreateObject(cascadeName, minFaceSize); | ||
} | ||
|
||
public void start() { | ||
nativeStart(mNativeObj); | ||
} | ||
|
||
public void stop() { | ||
nativeStop(mNativeObj); | ||
} | ||
|
||
public void setMinFaceSize(int size) { | ||
nativeSetFaceSize(mNativeObj, size); | ||
} | ||
|
||
public void detect(Mat imageGray, MatOfRect faces) { | ||
nativeDetect(mNativeObj, imageGray.getNativeObjAddr(), faces.getNativeObjAddr()); | ||
} | ||
|
||
public void release() { | ||
nativeDestroyObject(mNativeObj); | ||
mNativeObj = 0; | ||
} | ||
|
||
private long mNativeObj = 0; | ||
|
||
private static native long nativeCreateObject(String cascadeName, int minFaceSize); | ||
private static native void nativeDestroyObject(long thiz); | ||
private static native void nativeStart(long thiz); | ||
private static native void nativeStop(long thiz); | ||
private static native void nativeSetFaceSize(long thiz, int size); | ||
private static native void nativeDetect(long thiz, long inputImage, long faces); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.